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

本文详细解析了操作系统启动过程中CPU如何通过cs:ip, ds:xxxx和ss:sp访问内存,解释了cs, ds, ss寄存器的作用。cs寄存器配置代码段位置,ds用于数据段,ss:sp定义栈顶地址。内容包括寄存器初始化、内存规划和栈的设置。" 126924559,13436977,MySQL日志管理:类型、查看与配置,"['数据库', 'mysql', '日志']
摘要由CSDN通过智能技术生成

操作系统代码最开头的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小白20200202

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值