购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.7 完成并编译主引导扇区代码

5.7.1 主引导扇区有效标志

主引导扇区在系统启动过程中扮演着承上启下的角色,但并非是唯一的选择。如果硬盘的主引导扇区不可用,系统还有其他选择,比如可以从光盘和U 盘启动。

然而,如果不试试水的深浅就一个猛子扎下池塘,这并非一个明智之举。同样地,如果主引导扇区是无效的,上面并非是一些处理器可以识别的指令,而处理器又不加鉴别地执行了它,其结果是陷入宕机状态,更不要提从其他设备启动了。

为此,计算机的设计者们决定,一个有效的主引导扇区,其最后两个字节的数据必须是0x55 和0xAA。否则,这个扇区里保存的就不是一些有意而为的数据。

定义这两个字节很简单,伪指令db 和dw 就可以实现。源程序第103 行就是db 版本的实现,但没有标号。标号的作用是提供当前位置的汇编(偏移)地址供其他指令引用,如果没有任何指令引用这个地址,标号可以省略。这是两个单独的字节,所以0x55 在前,0xAA 在后,即使编译之后也是这个顺序。

但是,如果采用dw 版本,应该这样写:

因为,在Intel 处理器上,将一个字写入内存时,是采用低端字节序的,低字节0x55 置入低地址端(在前),高字节0xAA 在高地址端(在后)。

麻烦在于,如何使这两个字节正好位于512 字节的最后。前面的代码有多少个字节我们不知道,那是由NASM 编译器计算和跟踪的。

我们当然有非常好的办法,但还不宜在这里说明。但是,经过计算和尝试,我知道,在前面的内容和结尾的0xAA55 之间,有203 字节的空洞。因此,源程序的第102 行,用于声明203 为0的数值来填补。

为了方便,伪指令times 可用于重复它后面的指令若干次。比如

将在编译时重复生成mov ax,bx 指令20 次,即重复该指令的机器码(89 D8)20 次。

因此

将会在编译时保留203 个为0 的字节。

5.7.2 代码的保存和编译

本章的代码是现成的,配书源代码解压缩之后,可以在文件夹“c05”里找到,文件名为c05_mbr.asm。打开该文件,将其编译成c05_mbr.bin。

该文件的大小为512 字节,可以用配书工具HexView 来查看其内容,如图5-8 所示。

图5-8 用配书工具HexView 查看c05_mbr.bin 的内容

显而易见,在编译之后,源程序中的标号、注释、伪指令都统统消失了,只剩下纯粹的机器指令和数据。那些需要在编译阶段决定的内容,也都有了确切的值。 Rp1Ot3Gu94LHEHly6Nb50NYQvwjgdY7ScrZH3IvlfYJHu8Egt6FOXKlZc0onAsLi

点击中间区域
呼出菜单
上一章
目录
下一章
×