源程序第51 行,用于在显示了各个数位之后,再显示一个字符“D”。目的地址是由ES:DI 给出的,源操作数是立即数0x0744,其中,高字节0x07 是黑底白字的显示属性,低字节0x44 是字符“D”的ASCII 码。字的写入是按低端字节序的,请自行参照图6-5。
整个程序到此结束。为了使处理器还有事做,源程序第53 行,是一个无限循环。NASM 编译器提供了一个标记“$”,该标记等同于标号,你可以把它看成是一个隐藏在当前行行首的标号。因此,jmp near $的意思是,转移到当前指令继续执行,它和
是一样的,没有区别,但不需要使用标号,更不必为给标号起一个有意义的名字而伤脑筋。
和第5 章一样,为了得到不多不少,正好512 字节的编译结果,同时最后两个字节还必须是0x55 和0xAA,需要在所有指令的后面填充一些无用的数据。
源程序第55 行,用于重复伪指令“db 0”若干次。重复的次数是由510-($-$$)得到的,除去0x55 和0xAA 后,剩余的主引导扇区内容是510 字节;$是当前行的汇编地址;$$是NASM 编译器提供的另一个标记,代表当前汇编节(段)的起始汇编地址。当前程序没有定义节或段,就默认地自成一个汇编段,而且起始的汇编地址是0(程序起始处)。这样,用当前汇编地址减去程序开头的汇编地址(0),就是程序实体的大小。再用510 减去程序实体的大小,就是需要填充的字节数。
就像处理器把内存划分成逻辑上的分段一样,源程序也应当按段来组织,划分成独立的代码段、数据段等。从本书第8 章开始,将引入这方面的内容。