编写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