![x86汇编与逆向工程:软件破解与防护的艺术](https://wfqqreader-1252317822.image.myqcloud.com/cover/730/53287730/b_53287730.jpg)
2.2 汇编语法
在数千种可能的计算机架构中选取x86是重要的,但这还不够。虽然指令集架构(ISA)定义了诸如寄存器、数据格式和机器指令等因素,但它并未规定语法。
只要汇编语言遵循寄存器、寻址等的所有规则,并且定义了正确的指令集,它就是一个有效的x86语言。例如,x86语言必须有乘法操作。然而,它的助记符可以是mul、MUL、multiply等。
汇编语言的语法完全由汇编器确定。没有通用的汇编语言标准语法,也没有特定的x86汇编语法。因此,汇编语法存在成百上千种变体。
然而,你会发现大多数x86汇编工具使用两种主流的x86语法:AT&T语法和Intel语法。在这两个主要分支下,有数百种特定于汇编器的变体。
虽然Intel语法和AT&T语法都是针对x86的,但它们看起来非常不同。例如,考虑一条旨在将存储在地址ebx+4*ecx+2020的内存移到寄存器eax的语句。
这个指令在Intel语法和AT&T语法中表现得非常不同:
![](https://epubservercos.yuewen.com/2FAC88/31751360804058606/epubprivate/OEBPS/Images/31_01.jpg?sign=1739549318-thpuHzUASgrcfTEWNVu94Q4H3EjwdZJI-0-abc97c88d06c45bf3a054e57ab0edac6)
在Intel语法中,mov指令后面跟着的是结果将要存储的位置。内存访问是通过方括号来指示的,而内存地址[ebx+4*ecx+2020]的计算则是在这些括号内进行的。
AT&T语法与Intel语法在以下方面存在差异:
• 顺序:参数位置被交换,因此目标位置被列在第二位。
• 寄存器:AT&T使用百分号(%)来表示寄存器,而Intel则不这么做。
• 内存访问:AT&T使用圆括号来指示内存访问,而Intel则使用方括号。
• 计算:在AT&T和Intel语法中,所需内存地址的计算看起来有很大的区别。
• 指令:虽然在这里没有展示出来,但AT&T经常使用与Intel不同的且更长的指令助记符。
为了清晰和连贯,本书中的示例选择了Intel语法。以下是选择Intel而非AT&T的一些原因:
• Intel支持:Intel是占据主导地位的处理器开发商,他们使用的是Intel语法。
• 工具使用:大部分主要的逆向工程工具(比如IDA)都使用Intel语法。
• 可读性:人们普遍认为,Intel语法比AT&T语法更清晰、易读、易写。