第3回 做好访问内存的基础准备工作

操作系统代码最开头的512字节的数据,从硬盘的启动区先是被移动到了内存的0x7c00处,然后又立刻被移动到了0x90000处,并且跳转到此处再稍稍偏移go这个标签所代表的偏移地址处,接下来,我们就把目光放在go这个标签的位置,跟着CPU的步伐往后看:

go:

mov ax, cs

mov ds, ax

mov es, ax

mov ss ,ax

mov sp, #0xFF00

一眼望去,全是move操作。这段代码的意思很容易理解,就是把cs寄存器的值分别赋给ds,es和ss寄存器,然后再把0xFF00给了SP寄存器。

如果你能把Intel CPU手册月度一遍并且有个大概的认识,那理解这几行代码就不在话下了。

这些寄存器是干什么的

cs寄存器代表代码段寄存器,CPU即将要执行的代码在内存中的位置,就是由cs:ip这组寄存器配置指向的,其中cs是基址,ip是偏移地址。

之前执行过的一个段间跳转指令

jmpi go, 0x9000

这个指令的另一种伪代码表示为:

cs = 0x9000

ip = go

所以现在cs寄存器里的值就是0x9000,ip寄存器里的值就是go这个标签的偏移地址。所以刚刚说的三个mov指令就分别给ds,es和ss寄存器里的值赋为0x9000,也就是cs寄存器里的值。

ds为数据段寄存器,作为访问内存数据时的基地址。现在代码已经被挪到了0x90000处,所以现在自然又被赋值为0x9000了。

ss为栈段寄存器。后面要配合栈指针sp来表示此时的栈顶地址,而此时sp寄存器被赋值为0xFF00了,所以目前的栈顶地址就是ss:sp所指向的0x9FF

相关推荐

  1. 3 访问基础准备工作

    2024-06-11 17:36:03       11 阅读
  2. 基于 SRAM 计算

    2024-06-11 17:36:03       11 阅读
  3. 七讲 对象基本组成-引用-栈内存-堆

    2024-06-11 17:36:03       17 阅读
  4. 分区

    2024-06-11 17:36:03       18 阅读
  5. Go如何并发访问

    2024-06-11 17:36:03       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-11 17:36:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-11 17:36:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-11 17:36:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-11 17:36:03       18 阅读

热门阅读

  1. 登录CarSim显示CVI版本过低,软件打不开

    2024-06-11 17:36:03       9 阅读
  2. 王冲解读:商业模式如何创新重塑行业生态

    2024-06-11 17:36:03       12 阅读
  3. 重介降浊一体化设备处理煤矿等重浊度污水

    2024-06-11 17:36:03       9 阅读
  4. 使用 Docker Compose 编排 Django 应用

    2024-06-11 17:36:03       8 阅读
  5. Rhino Linux 2024.1

    2024-06-11 17:36:03       9 阅读
  6. 第一章 - 第4节-计算机软件系统 - 课件

    2024-06-11 17:36:03       7 阅读
  7. 37、Flink 的 WindowAssigner之会话窗口示例

    2024-06-11 17:36:03       7 阅读
  8. C语言Socket实现Http的post请求

    2024-06-11 17:36:03       10 阅读