x86 Assembly/AT&T vs Intel

x86 Assembly/AT&T vs Intel

AT&T 和 Intel 汇编语法的主要区别

x86 汇编语法也分两大流派:

  • Intel 语法。常用于 Windows。
  • AT&T 语法。Linux 系统工具链(如 gcc, gdb)均使用这种。

参数顺序

首先,两者最让人纠结的区别就是源操作数、目标操作数的顺序。AT&T 语法先写源操作数,再写目标操作数;Intel 语法先写目标操作数,再写源操作数:

AT&T
movl %esp, %ebp

Intel
MOV EBP, ESP

指令命名

然后,另一个明显的区别就是指令的命名(或者说,操作数大小的指定方式)。AT&T 语法将操作数的大小表示在指令的后缀中(b、w、l);Intel 语法将操作数的大小表示在操作数的前缀中(BYTE PTR、WORD PTR、DWORD PTR):

AT&T
decw (%eax)

Intel
DEC WORD PTR [EBX]

## 取址方式

再者,各种取址方式的表示。AT&T 语法总体上是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, [EBX4+0100] MOV EAX, [EDX+EBX4+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 语法要在常数前加 $、在寄存器名前加 % 符号;Intel 语法没有相应的东西要加:

AT&T
subl $0x30, %eax

Intel
SUB EAX, 30


Last update: 2018-06-15 07:16:00 UTC