AT&T 汇编语法
AT&T 指令格式和 Intel 指令格式的操作数方向是相反的,在 AT&T 中,第一个是源操作数,第二个目标操作数,如:
mov $1, $ebx
对应的Intel指令格式为:
mov ebx, 1
1. 16进制
以0x开头,如0xffffffff。Intel指令格式以“h”结尾,如ffffffffh。
2. 操作数
2.1. 立即数
以$开头:
mov $8, %ebx movl $0xffffffff, %eax
2.2. 寄存器
以%开头,如:%ebx。
寄存器寻地如下:
mov 0x40401f(%rcx),%rbx
2.3. 内存单元操作数
例如 Intel 格式:
mov eax, [ebx+5]
对应的 AT&T 格式为:
mov 5(%ebx), %eax
3. 操作码后缀
后缀是为了指明操作码的大小
后缀 | 含义 | Intel语法 |
---|---|---|
l | 32位长整数 | dword ptr |
w | 字,16位 | word ptr |
b | 字节,8位 | byte ptr |
q | 64位 |
例:
Intel格式 | AT&T格式 |
---|---|
mov eax, ebx | movl %eax, %ebx |
mov ax, bx | movw %bx, %ax |
mov al, bl | movb %bl, %al |
4. 间接寻址
在 Intel 中,后缀“h”表示16进制,“b”表示2进制。
Intel格式 | AT&T格式 |
---|---|
mov eax, [ebx+10h] | movl 0x10(%ebx), %eax |
add eax, [ebx+eax*2h] | addl (%ebx, %eax, 0x2), %eax |
mov eax, [ebx+eax] | movl (%ebx, %eax), %eax |
mov eax, [ebx+eax*2h-10h] | movl -0x10(%ebx, %eax, 0x2), %eax |