2.1.2 NASM编译器

来源:互联网 发布:低价机票 知乎 编辑:程序博客网 时间:2024/06/05 18:19

很多人在学习汇编的时候都可能是从I386学起的,使用的编译器是MASM(MASM 是Microsoft Macro Assembler 的缩写),其实NASM的格式与MASM总体上是差不多的。

值得说明的有如下几点:

1. [ ]的使用

在NASM中,如果你引用标签或者变量名, 都被认为引用的是该名字的地址,如果想访问他们里面的内容,必须使用 [ ]。这么理解如果不太容易记忆的话,那么你可以把他想象成C语言里的数组,数组名字代表的是它的地址,加上[ ]就代表的是它里面的内容。是不是一下子就明白了?其实,说不定C的编译器就是这么做的呢,毕竟C编译器会把代码编译成汇编代码,然后再编译成二进制文件的,对吧~!

2. $

$表示当前地址——当前行被编译后的地址。好像不太容易理解对吧,不要紧,请看下面的代码:

jmp $  

这句汇编的意思就是死循环,转化成机器码是E9 FD FF,其中E9的意思是jmp,FD FF是个地址,但是在x86里面是小端排列的,所以要将数值转换为地址:FFFD,其实就是-3,这个jmp是相对跳转,跳转的地址就是执行完这条命令后,指令寄存器-3的地址,正好这条指令的长度就是3个字节,所以,又回到了这条指令重新执行。上述过程中,$指的就是地址E9啦。

3. $$

明白了$是什么意思呢?

它表示的是一个节(section)的开始处被编译后的地址(就是这个节的起始地址)。我们一般写汇编程序的时候,使用一个section就够了,只有在写复杂程序的时候,才会用到多个section。section既可以是数据段,也可以是代码段。所以,如果把section比喻成函数,还是不太恰当。

提示:

在写程序的过程中,$会经常被用到,它表示本行程序距离节(section)开始处的相对距离。如果只有一个节(section)的话,那么他就表示本行程序距离程序头的距离。在以后我们会把它与times联合使用,如:

times 512 - ( $ - $$) db 0  

它的意思将在第三章给大家做详细解释,同时也希望有兴趣的同学,自己学习一下,就当做是一个课后作业吧,嘿嘿。~

本文已在图灵出版社社区连载中,欢迎大家前去阅读。

网址:http://www.ituring.com.cn/minibook/29303

0 0
原创粉丝点击