Intel汇编和AT&T汇编的区别?

一、前缀不同

在 Intel 语法中,没有寄存器前缀或立即前缀。 然而,在 AT&T 中,寄存器的前缀是“%”,而 immed 的前缀是“$”。 Intel 语法十六进制或二进制即时数据分别带有“h”和“b”后缀。 此外,如果第一个十六进制数字是字母,则该值前面带有“0”前缀。

例如下面这个表格:

Intel汇编和AT&T汇编的区别?_第1张图片

二、 操作数的位置不同

Intel 语法中操作数的方向与 AT&T 语法中的操作数方向相反。 在 Intel 语法中,第一个操作数是目标,第二个操作数是源,而在 AT&T 语法中,第一个操作数是源,第二个操作数是目标。 AT&T 语法在这种情况下的优势是显而易见的。 我们从左到右读,从左到右写,所以这种方式很自然。

Intel汇编和AT&T汇编的区别?_第2张图片

三、内存操作数的写法不同

上面看到的内存操作数也不同。 在 Intel 语法中,基址寄存器包含在'[' and ']' 中,而在 AT&T 语法中,基址寄存器包含在'(' and ')' 中。 

Intel汇编和AT&T汇编的区别?_第3张图片

与 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) 更容易理解。

Intel汇编和AT&T汇编的区别?_第4张图片

 四、后缀不同

您可能已经注意到,AT&T 语法助记符有一个后缀。 该后缀的意义在于操作数的大小。 “l”代表长,“w”代表字,“b”代表字节。 Intel 语法具有与内存操作数类似的指令,即字节 ptr、字 ptr、双字 ptr。 “dword”当然对应于“long”。 这类似于 C 中的类型转换,但它似乎没有必要,因为所使用的寄存器的大小是假定的数据类型。

Intel汇编和AT&T汇编的区别?_第5张图片

 最后讲两个单词,HEX是16进制的意思,Intel汇编的H后缀也是这么来的,HEX是Hexadecimal的缩写。Binary是二进制的意思,Intel汇编的B后缀是这个单词。

你可能感兴趣的:(手搓操作系统,汇编,操作系统)