第一章:从开机加电到执行main函数之前的过程
1.2.2 加载第二部分代码----setup
3.将Setup程序加载到内存中
执行完之前的复制过程就要执行第二步操作:将Setup程序加载到内存中,加载setup这个程序,要借助BIOS提供的int 0x13终端向量所指向的中断服务程序(即磁盘服务程序)来完成。int 0x13的中断服务程序可以根据设计者的意图,把指定扇区的代码加载到内存的指定位置。
针对服务程序的特性,使用int 0x13H中断时,就要事先将指定的扇区和加载的内存位置等信息传递给服务程序。
补充:直接磁盘服务的功能描述,部分如下(其他具体参数课自行查找):
;功能描述:读扇区
;入口参数:AH=02H
;AL=扇区数
;CH=柱面
;CL=扇区
;DH=磁头
;DL=驱动器,00H-7F:软盘;80-0FFH:硬盘
;ES:BX=缓冲区的地址
;出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码。
代码如下:
load_setup:
mov ds,#0x0000 ;AH=02H,是功能02H,为读扇区,设置驱动器和磁头,DL=0驱动器为0,DH=0磁头为 0
mov cx,#0x0002 ;同上,CH=0,柱面为0,CL为2,扇区为2,cl=开始扇区(位0—5),磁道号高二位(位6 -7)
mov bx,#0x0200 ;设置读的地址为es:dx = 0x90200,es为0x9000,bx为0200
mov ax,#0x0200+SETUPLEN ;AL为扇区数为4,即调入4个扇区
;到此参数传递完成
int 0x13 ;调用中断
jnc ok_load_setup ;读入成功则跳转,否则下一步
mov dx,#0x0000 ;未成功,复位磁盘
mov ax,#0x0000 ;因为未成功,则AL值被置为一个特定值,所以要进行重置
int 0x13 ;参数传递完毕后,执行0x13中断,通过中断向量表找到这个中断服务程序,将软盘从
;第二扇区开始的四个扇区,即setup.s对应的程序加载至内存的SETUPSEG(0x90200)处。
j load_setup ;重新循环,再次读取
ok_load_setup:
在参数传递完毕后,执行int 0x13H指令,产生0x13中断,通过中断向量表找到这个中断服务程序,将软盘从第二扇区开始的4个扇区,即setup.s对应的程序加载至内存的SETUPSEG(0x90200处),现在操作系统已经从软盘中加载了5个扇区的代码,等bootsect执行完毕后,setup开始工作。