虽然同为 x86 汇编,但语法也分两大流派:之前上学时学的 Intel 语法,以及流行于 Unix/Linux 平台上的 AT&T 语法。
首先,两者最让人纠结的区别就是源操作数、目标操作数的顺序。AT&T 语法先写源操作数,再写目标操作数;Intel 语法先写目标操作数,再写源操作数:
- AT&T
-
movl %esp, %ebp
- Intel
-
MOV EBP, ESP
- AT&T
-
decw (%eax)
- Intel
-
DEC WORD PTR [EBX]
offset(base, index, width)
的格式;Intel 语法总体上是
[INDEX * WIDTH + BASE + OFFSET]
的格式:
- AT&T
-
movl 0x0100, %eax movl (%esi), %eax movl -8(%ebp), %eax movl 0x0100(,%ebx,4), %eax movl 0x8(%edx,%ebx,4), %eax
- Intel
-
MOV EAX, [0100] MOV EAX, [ESI] MOV EAX, [EBP-8] MOV EAX, [EBX*4+0100] MOV EAX, [EDX+EBX*4+8]
另外,各种非十进制数制下数字的表示方法。AT&T 语法用前缀表示数制(0x、0、0b);Intel 语法用后缀表示数制(h、o、b):
- AT&T
-
movl 0x8 , %eax movl 010 , %eax movl 0b1000, %eax
- Intel
-
MOV EAX, 8h MOV EAX, 10o MOV EAX, 1000b
- AT&T
-
subl $0x30, %eax
- Intel
-
SUB EAX, 30
于是,以上就是 AT&T 和 Intel 汇编语法的主要区别了……吧?
转载于http://timothyqiu.com/archives/difference-between-att-and-intel-asm-syntax/