首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

其实程序的主体框架只有5行(从第2行到第6行),其中调用了一个显示字符串的子程序。程序的第234行是3mov指令,使dses两个段寄存器指向与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

注意:这里的section属于NASM规范的一部分,表示一段代码,关于它和$$更详细的注解请参考NASM联机技术文档。

 

在写程序的过程中,$-$$可能会被经常用到,它表示本行距离程序开始处的相对距离。现在,你应该明白510-($-$$)表示什么意思了吧?times 510-($-$$) db 0表示将0这个字节重复510-($-$$)遍,也就是在剩下的空间中不停地填充0,直到程序有510B为止。这样,加上结束标志0xAA55占用的2B,恰好是512B

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论