AT&T 汇编与 Intel 汇编区别

  1. 前缀不同

在 Intel 的语法中,寄存器和和立即数都没有前缀。 但是在 AT&T 中,寄存器前需要加上"%",而立即数前需要加上"$"。 在 Intel 的语法中,十六进制和二进制立即数后缀分别是"h"和"b",而在 AT&T 中,十六进制立即数前需要加上"0x"。

Intel 语法AT&T 语法
mov eax,8movl $8,%eax
mov ebx,0ffffhmovl $0xffff,%ebx
int 80hint $0x80
  1. 操作数方向不同

Intel 与 AT&T 操作数的方向正好相反。 在 Intel 语法中,第一个操作数是目的操作数,第二个操作数源操作数。 而在 AT&T 中,第一个数是源操作数,第二个数是目的操作数。

Intel 语法AT&T 语法
mov eax,[ecx]movl (%ecx),%eax
  1. 内存单元操作数不同

在 Intel 的语法中,基寄存器用"[]"括起来,而在 AT&T 中,用"()"括起来。

Intel 语法AT&T 语法
mov eax,[ebx+5]movl 5(%ebx),%eax
  1. 寻址方式不同

Intel 的指令格式是 segreg:[base+index*scale+disp],而 AT&T 的格式是%segreg:disp(base,index,scale)。 其中 index/scale/disp/segreg 全部是可选的,完全可以简化掉。 如果没有指定 scale 而指定了 index,则 scale 的缺省值为 1。 当立即数用在 scale/disp 中时,不应当在其前冠以"$"前缀。

Intel 语法AT&T 语法
mov eax,[ebx+20h]movl 0x20(%ebx),%eax
add eax,[ebx+ecx*2haddl (%ebx,%ecx,0x2),%eax
lea eax,[ebx+ecx]leal (%ebx,%ecx),%eax
sub eax,[ebx+ecx*4h-20h]subl -0x20(%ebx,%ecx,0x4),%eax
  1. 后缀不同 在 AT&T 的操作码后面有一个后缀,其含义就是指出操作码的大小。 "l"表示长整数(32 位),"w"表示字(16 位),"b"表示字节(8 位)。 而在 Intel 的语法中,则要在内存单元操作数的前面加上 byte ptr, word ptr 和 dword ptr。
Intel 语法AT&T 语法
mov al,blmovb %bl,%al
mov ax,bxmovw %bx,%ax
mov eax,ebxmovl %ebx,%eax
mov eax,dword ptr [ebx]movl (%ebx),%eax