在数千种可能的计算机架构中选取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语法中表现得非常不同:
在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语法更清晰、易读、易写。