4) 屏幕显示“Loading system…”
! Print some inane message
! 显示信息:“'Loading system ...' 回车”,共显示24个字符
! 使用BIOS中断0x10功能号ah=0x03和ah=0x13实现
! 请仔细阅读中断的使用
! BIOS中断0x10功能号ah=0x03,功能:读光标位置
! 输入:bh=页号
! 返回:ch=扫描开始线;cl=扫描结束线;dh=行号; dl=列号
! BIOS中断0x10功能号ah=0x13,功能:显示字符串
! 输入:al=放置光标方式及规定属性。0x01表示使用bl中属性值,光标停在字符串结尾处;
! es:bp 指向要显示的字符串起始位置。 cx=显示字符串个数; bh=显示页面号
! bl=字符属性; dh=行号; dl=页号
mov ah,#0x03 !读光标
xor bh,bh ! xor代表异或,这条命令将bh置0
int 0x10 !返回行号和列号,供串口显示
mov cx,#24 ! 显示24个字符
mov bx,#0x0007 ! bh=0,页=0;bl=7,字符属性=7
mov bp,#msg1 ! es:bp寄存器指向要显示的字符串
mov ax,#0x1301 ! ah=0x13使用中断0x10功能号;al=0x01,使用bl中属性值
int 0x10 !开中断,串口打印字符串
上面使用中断0x10显示字符,首先使用ah=0x03功能获取光标位置以及行号列号,作为ah=0x13中断的入参;而后使用ah=0x13中断将存在es:bp寄存器的字符串打印在串口屏幕,只要在使用中断时,将输入设定好即可。
5) 把磁盘setup模块后面的system模块加载到内存0x10000
SYSSEG = 0x1000
…
mov ax, #SYSSEG
mov es,ax ! es寄存器存放system段地址
call read_it ! 调用read_it函数,读取磁盘上system模块,es为输入参数
…
read_it函数主要实现:
(1)判断es值是否位于64KB地址边界,否,则进入死循环;
(2)bx取异或操作,将bx置0,此时es:bx为0x1000:0x0000,即内存0x10000地址;
(3)通过前面获取的每磁道扇区数,判断读取的扇区个数(system模块所占),即确定需要加载的system模块的开始地址和结束地址;
(4)从system模块开始地址处读取数据到es:bx,期间不断判断是否读取到结尾处,如果是,则结束读取,否则继续读取。