第3章 从软驱上读取多个扇区到内存中

编写rd_kern汇编函数,用于从软驱上读取N个扇区到内存中

输入参数是

CX 扇区数

SI 起始逻辑扇区

ES:BX 内存地址

#函数名:rd_kern
#功能:读取软驱A上连续多个扇区
#参数1:  ES:BX    读取数据存放的目的地址
#参数2:  SI        指定起始逻辑扇区号    
#参数3:  CX        欲读取的扇区数目
rd_kern:
    pushw   %ax
rd_k1:
    call    rd_sect
    movw    %es,    %ax        #
    addw    $0x20,  %ax        #
    movw    %ax,    %es        # es:bx += 512
    incw    %si            # ++si
    loop    rd_k1        # if(cx != 0) goto rd_k1;
    popw    %ax
    ret




下面是读取软驱A的全部代码

#读取kernel到0x7e00上
load:
    #设置临时栈
    xorw    %ax,    %ax
    movw    %ax,    %ds        # ds = 0x0
    movw    %ax,    %ss        # ss = 0x0,栈基址
    movw    $KERNEL_STACK_BOT,%sp        # sp = 0x7c00,栈地址    
    
    #设置rd_kern的参数
    #设置ES:BX参数
    movw    $KERNEL_START_SEGMENT, %ax
    movw    %ax,    %es        # es = 0x7e0
    xorw    %bx,    %bx        # bx = 0x0,  es:bx = 0x7e00

    #读取的起始扇区号(逻辑扇区起始扇区号是0)
    movw    $0x1,   %si        # si = 0x1 ,是rd_sect的参数
    
    #读取1400个扇区,共700K
    movw    $KERNEL_SECT_NUMBER,  %cx

    #调用rd_kern函数
    #读取700K的kernel到0x7e00上
    call    rd_kern 

Leave a Reply

Your email address will not be published. Required fields are marked *