上一次,我们看到已经把操作系统最开始的512个字节,通过256次复制到0x90000处,然后跳转到0x9000:go这里去执行。
今天我们主要看一下go标签具体做了啥?
go: mov %cs, %ax # 将ds,es,ss都设置成移动后代码所在的段处(0x9000)
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
mov $0xFF00, %sp # put stack at 0x9ff00.
这里看的都是mov指令。前四行就是把 cs 给到 ax, ds, es, ss 这几个寄存器。最后一行是 把寄存器sp的值给弄成 0xFF00。
那为什么要这么弄呢? 我们需要对这些寄存器有一些基本了解。
以s结尾的都是段寄存器。其中
比如上次遇到过的那个跳转指令:
ljmp 0x9000, $go
这里cs 就是 0x9000, ip 就是 go。继续把这张图完善一下:
现在栈顶指针指向的位置也出来了。
CPU访问内存主要有三种途径:
那现在就明白了,给这些寄存器赋值就是为了给访问内存做好准备。
那一个操作系统的代码肯定不止 512个字节, 下一步我们接着学习,怎么把剩下的代码给弄到内存里来运行的?
我是老张!一个陪你成长的码农。我们下次见!