bootsect.s中的load_setup

bootsect.s中的load_setup
from: http://blog.sina.com.cn/s/blog_5028978101008wjl.html

该代码来自linux0.11内核代码/boot/bootsect.s
该段代码的作用是使用 int 13h 把磁盘上的setup模块(4个扇区)加载到内存中,位置在bootsect.s(0x90000+512字节 = 0x90200处)之后,整个过程主要是操作 ax , bx , cx , dx 等四个通用寄存器。其实现的步骤:
SETUPLEN  =   4           !setup模块的长度.
INITSEG 
=  0x90200     !setup模块被加载的地址.
 .
 load_setup:
        mov   dx 
,  #0x0000 !DH = 0磁头 DL=软盘驱动器,
                           !(00H~7FH:软盘;80H~0FFH:硬盘;
                           !ES:BX=缓冲区的地址).
        mov   cx  ,  #0x0002 !CH = 0柱面  CL = 第二扇区.
        mov   bx 
,  #0x0200 !前面代码可知:es = 0x9000 所
                           !以、缓冲区es:bx = 0x9000:0x0200
                           ! = 0x90200,这就意味着,磁盘中
                           !的数据将从这个地址开始加载入内存.
        mov   ax  ,  #0x0200 + SETUPLEN !ah = 0x02 为读扇区的入
                           !口参数 AL为要读入的扇区数4 ,
                           !到此参数设置完毕.
        int      0x13         !发出中断信号,开始读取.
                           !进位标志CF(Carry Flag)=0 表示操作
                           !成功,AH=00H,AL=传输的扇区数,否
                           !则,AH=状态代码.
        jnc   ok_load_setup   !故名思意,如果成功就跳到下面
                              !ok_load_setup处,否则执行下面的代码,
                              !复位磁盘再次执行这段代码
        mov   dx 
,  #0x0000    !再次设置驱动器为软盘驱动器
        mov   ax 
,  #0x0000    !入口参数为 ah=00h 重启磁盘(软盘系
                              !统复位),这个时候由于前面的操作磁
                              !盘已经转到某个位置,所以必须重新启动
                              !磁盘,让磁头归位.
        int   0x13
        j     load_setup      !跳转回去继续执行,如果总是失败系统
                              !将总执行这段代码.
ok_load_setup:
         .

参看资料:

直接磁盘服务(Direct Disk Service——INT 13H)  

 

功能00H 
功能描述:磁盘系统复位 
入口参数:AH=00H 
DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 
出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 

 功能02H  
功能描述:读扇区 
入口参数:AH=02H 
AL=扇区数 
CH=柱面 
CL=扇区 
DH=磁头 
DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 
ES:BX=缓冲区的地址 
出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明 


地震让大伙知道:居安思危,才是生存之道。

你可能感兴趣的:(bootsect.s中的load_setup)