学习linux0.11内核代码——引导启动程序bootsect.s(3)

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代表异或,这条命令将bh0
         int     0x10                    !返回行号和列号,供串口显示

         mov  cx,#24                           ! 显示24个字符
         mov  bx,#0x0007                  ! bh=0,页=0bl=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 = 0x1000mov  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,期间不断判断是否读取到结尾处,如果是,则结束读取,否则继续读取。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/cui841923894/article/details/82191885