02 从 0x7c00 到 0x90000

你好,我是闪客。

你可能会问,这一讲操作系统是不是就该做一些更高深的事情了?想多了,完全没有,等你读完这一讲后,你就知道了。

上一讲,我们讲了CPU 执行操作系统的最开始的两行代码:

mov ax,0x07c0
mov ds,ax

这两行代码将数据段寄存器 ds 的值变成了 0x07c0,方便之后访问内存时,利用这个段基址进行寻址。

接下来我们带着这两行代码,继续往下看 6 行,代码如下:

mov ax,0x9000
mov es,ax
mov cx,#256
sub si,si
sub di,di
rep movw

此时,ds 寄存器的值已经是 0x07c0 了,然后又通过同样的方式将 es 寄存器的值变成 0x9000,接着又把 cx 寄存器的值变成 256(代码里确实是用十进制表示的,与其他地方有些不一致,不过不影响)。

现在 dsescx 寄存器的值就都被赋上了确定的值了,我们先接着往下看。

再往下看有两个 sub 指令:

sub si,si
sub di,di

这个 sub 指令很简单,比如:

sub a,b

表示的意思是:

a = a - b

那么这行代码:

sub si,si

就表示:

si = si - si

也就是说,如果 sub 后面的两个寄存器一模一样,就相当于把这个寄存器里的值清零,这是一个基本玩法。