D_D系统构建-MBR(4)代码剖析

来源:互联网 发布:农村创业软件 编辑:程序博客网 时间:2024/06/01 20:12

上一章节我们将代码都罗列出来 ,实际上这还是一个测试代码,不会真正的加载 loader; 在后面Loader实现后,会对此代码再进行充实完善,当前我们只用来验证下分段mbr是否能正常运行。

boot.asm如下:


这一行表示引用头文件的意思,与C中的include一样,编译时会在此展开。


section表示 这是一个段,align表示 编译时按照16bit对齐, vstart表示 段内起始地址,参考base_phy.inc知道,macro_boot_addr为0x7c00,正好是我们的boot加载地址

紧跟着定义一个数据字符串,用来显示下内容,bootmsglen为一个常量,类似c中的宏一样。它表示字符串长度



这段是实际 的代码运行区,先初始化相应的段寄存器,设置栈顶sp;然后清除屏幕并显示第7行设置的字符串信息。



这里先获取这个mbr剩余的字节,保存在mbr_left_len(第10 行),这里我们用地址相减的方法来获取剩余字节长度,这个我们最后看下他是如何计算这个长度的。

34行到41行计算出剩余字节对应的扇区数目,不足一个扇区的按照一个扇区来计算。

44到52行,将上一步计算出的扇区数目,起始扇区号,起始 内存地址传入getDataFromSectors函数 ;这里面的起始扇区号=4096 , 起始 内存0x7e00,这都是我们约定好的。

getDataFromSectors完成剩余内容读入到指定内存位置处



54行就简单了,加载 完内容后,跳转到load-loader处执行,这里面有点特殊的是这个Load-loader实际 的位置是在512字节之后,



56-75行定义了clearscreen的实现, 与c里面的函数定义一样。这个完成屏蔽清除,并将光标设置为屏蔽起始 位图处。



76-99行,定义了showstring的实现,用来 显示指定字符串。它先读取当前光标位置,然后在此位置上显示用户传入的字符





这个getdatafromsectors是 这个boot的主要函数 ,113-118获取传入的扇区起始地址,扇区数目,内存起始地址 ; 它要完成磁盘内容读取的工作。这里面的读取采用lba模式,依次从端口0x1f0-0x1f7设置扇区数目,起始lba号(125-147),

然后检查是否可用(149-153),可用时再读取内容以指定内存处(155-169)



这个指令比较特殊点,使用了times,它表示重复多少个内存地址填写指定内容,并以0xaa55结束,这个是磁盘可加载 的标志,不能缺少。


后面多于512字节的主要是处理loader,当前定义一个loader字串,并显示 


上面说到我们需要计算出的内容,这里面直接使用mbr_end-loader-begin即可 



到此,我们的boot.asm就介绍完了,主要完成清除屏幕-》显示boot-》加载剩余内容-》跳转到剩余内容处执行,如果 一切正常,它会显示如上


  1. mbr_left_len dw mbr_end-loader_begin
原创粉丝点击