本文共 1366 字,大约阅读时间需要 4 分钟。
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,期间不断判断是否读取到结尾处,如果是,则结束读取,否则继续读取。