AT&T语法汇编和Intel语法汇编比较:
1. 前缀:
①在AT&T语法中,寄存器以‘%‘为前缀,立即数则以‘$‘为前缀,而Intel语法中则没有;
②在Intel语法中,十六进制立即数以‘h‘结尾,二进制立即数则以‘b‘结尾。另外对于编译器来说,十六进制立即数不能以字符a~f打头,需要在前面上加上‘0‘。而AT&T语法中,十六进制使用 " 0x数据 "来表示
Intel Syntax | AT&T Syntax |
mov eax, 1 | movl $1, %eax |
mov ebx, 0ffh | movl $0xff, %ebx |
int 80h | int $0x80 |
2. 运算方向:
在运算方向上,Intel语法与AT&T语法正好相反。 在Intel语法中,第一个是目标操作数,第二个是源操作数,而在AT&T语法中,第一个是源操作数,第二个是目标操作数。
3.内存运算:
Intel语法格式是 segreg:[base + index * scale + disp],
AT&T语法格式则是%segreg:disp(base, index, scale)。
AT&T语法 |
Intel语法 |
movl -4(%ebp), %eax |
mov eax, [ebp - 4] |
movl array(, %eax, 4), %eax |
mov eax, [eax*4 + array] |
movw array(%ebx, %eax, 4), %cx |
mov cx, [ebx + 4*eax + array] |
movb $4, %fs:(%eax) |
mov fs:eax, 4 |
在Intel语法中,内存单元用方括号表达,而在AT&T语法中,它是由圆括号括起来的。
4. 后缀:
后缀表示的是操作数的大小:
AT&T语法中‘l‘代表long(32bit), ‘w‘代表word(16bit)和‘b‘代表byte(1字节);Intel语法使用byte ptr, word ptr, dword ptr
AT&T中指令:
movb 传送字节
movw 传送字
movl 传送双字
5. 跳转指令;
AT&T 格式:ljump $section, $offset
Intel 格式: jmp far section:offset
AT&T 格式:lcall $section, $offset
Intel 格式:call far section:offset
直接跳转:即跳转目标是作为指令的一部分编码的(有可能是相对位移地址).
例如: jmp Label_1
间接跳转:即跳转目标是从寄存器或存储器位置中读出的. 写法是在" * "后面跟一个操作数指示符.
例如: jmp *%eax 用寄存器%eax中的值作为跳转目标
jmp *(%eax) 以%eax中的值作为读入的地址, 从存储器中读出跳转目标