操作系统编写之代码解释

 操作系统编写之代码解释


    其实程序的主体框架只是第2行到第6行这么一点点而已,其中调用了一个显示字符串的子程序。程序的第2、3、4行是3个mov指令,使ds和es两个段寄存器指向与cs相同的段,以便在以后进行数据操作的时候能定位到正确的位置。第5行调用子程序显示字符串,然后jmp $让程序无限循环下去。
可能有很多人开始学汇编时用的都是MASM,其实NASM的格式跟MASM总体上是差不多的,在这段程序中,值得说明的地方有以下几点:
1.方括号[]的使用
     在NASM中,任何不被方括号[]括起来的标签或变量名都被认为是地址,访问标签中的内容必须使用[]。所以,
    mov ax, BootMessage
    将会把“Hello, OS world!”这个字符串的首地址传给寄存器ax。又比如,如果有:
    foo dw 1
     则mov ax, foo将把foo的地址传给ax,而mov bx, [foo]将把bx的值赋为1。
     实际上,在NASM中,变量和标签是一样的,也就是说:
    foo dw 1 等价于 foo: dw 1
     而且你会发现,Offset这个关键字在NASM也是不需要的。因为不加方括号时表示的就是Offset。
笔者认为这是NASM的一大优点,要地址就不加方括号,也不必额外地用什么Offset,想要访问地址中的内容就必须加上方括号。代码规则非常鲜明,一目了然。
2.关于$和$$
    $表示当前行被汇编后的地址。这好像不太容易理解,不要紧,我们把刚刚生成的二进制代码文件反汇编来看看:
    $ ndisasmw -o 0x7c00 boot.bin >> disboot.asm
    打开disboot.asm,你会发现这样一行:
    00007C09  EBFE              jmp short 0x7c09
    明白了吧,$在这里的意思原来就是0x7c09。
    那么$$表示什么呢?它表示一个节(section)的开始处被汇编后的地址。在这里,我们的程序只有1个节,所以,$$实际上就表示程序被编译后的开始地址,也就是0x7c00。
    在写程序的过程中,$-$$可能会被经常用到,它表示本行距离程序开始处的相对距离。现在,你应该明白510-($-$$)表示什么意思了吧?
    times 510-($-$$) db 0表示将0这个字节重复510-($-$$)遍,也就是在剩下的空间中不停地填充0,直到程序有510字节为止。这样,加上结束标志0xAA55占用的2字节,恰好是512字节。

你可能感兴趣的:(c,框架,汇编,OS)