一、前缀不同
在 Intel 语法中,没有寄存器前缀或立即前缀。 然而,在 AT&T 中,寄存器的前缀是“%”,而 immed 的前缀是“$”。 Intel 语法十六进制或二进制即时数据分别带有“h”和“b”后缀。 此外,如果第一个十六进制数字是字母,则该值前面带有“0”前缀。
例如下面这个表格:
二、 操作数的位置不同
Intel 语法中操作数的方向与 AT&T 语法中的操作数方向相反。 在 Intel 语法中,第一个操作数是目标,第二个操作数是源,而在 AT&T 语法中,第一个操作数是源,第二个操作数是目标。 AT&T 语法在这种情况下的优势是显而易见的。 我们从左到右读,从左到右写,所以这种方式很自然。
三、内存操作数的写法不同
上面看到的内存操作数也不同。 在 Intel 语法中,基址寄存器包含在'[' and ']' 中,而在 AT&T 语法中,基址寄存器包含在'(' and ')' 中。
与 Intel 语法相比,涉及复杂操作的指令的 AT&T 形式非常晦涩难懂。
Intel 语法形式是 segreg:[base+index*scale+disp]
AT&T 语法形式为 %segreg:disp(base,index,scale)
Index/scale/disp/segreg 都是可选的,可以简单地省略。如果未指定且指定了索引,则比例默认为 1。Segreg 取决于指令以及应用程序是否在实模式或 pmode 下运行。 在实模式下它取决于指令,而在p模式下则不需要。 当用于缩放/显示时,使用的立即数据不应在 AT&T 中添加“$”前缀。
例如下面的表格:
如你所见,AT&T 非常晦涩。
英特尔汇编[base+index*scale+disp] 明显比AT&T汇编disp(base,index,scale) 更容易理解。
四、后缀不同
您可能已经注意到,AT&T 语法助记符有一个后缀。 该后缀的意义在于操作数的大小。 “l”代表长,“w”代表字,“b”代表字节。 Intel 语法具有与内存操作数类似的指令,即字节 ptr、字 ptr、双字 ptr。 “dword”当然对应于“long”。 这类似于 C 中的类型转换,但它似乎没有必要,因为所使用的寄存器的大小是假定的数据类型。
最后讲两个单词,HEX是16进制的意思,Intel汇编的H后缀也是这么来的,HEX是Hexadecimal的缩写。Binary是二进制的意思,Intel汇编的B后缀是这个单词。