此时操作系统的短短几行代码,就将数据段寄存器ds和代码段寄存器cs设置为了0x9000,方便了之后访问代码及访问数据。并且,将栈顶地址ss:sp设置在了离代码的位置0x9000足够遥远的0x9FF00处,保证栈向下发展不会轻易撞见代码的位置。
简单地说,就是设置了如何访问数据的数据毒段,如何访问代码的代码段,以及如何访问栈的栈顶指针,也即初步做了一次内存规划。从CPU的角度看,访问内存,就这么三块地方而已。
目前仅仅把硬盘中512字节的数据加载到内存了,但操作系统还有很多仍然在硬盘的其他扇区里,不能抛下它们不管。
把剩下的操作系统代码从硬盘请到内存
所以下一步自然是把仍然在硬盘里的操作系统代码请到内存中来。我们接着往下看:
Load_setup:
mov dx,#0x0000; drive 0, head 0
mov cx:#0x0002 ; sector 2, track 0
mov bx,#0x0200; address=512, in 0x9000
mov ax, #0x0200+4; service 2, nr of sectors
int 0x13
jnc ok_load_setup;
mov dx, #0x0000
int 0x13
jmp load_setup
ok_load_setup;
这里有两个Int指令我们还没见过。
注意这个int是汇编指令,可不是高级语言的整形变量。int 0x13表示发起0x13号中断,这条指令上的各种mov指令给dx,cx,bx,ax赋值