AT&T汇编格式主要用在Unix/Linux系统中,但是国内计算机课主要是以Intel汇编为主,其实这两种汇编只是语法格式不同而已,只要知道了两者的区别,有Intel汇编基础的人能很快的看懂AT&T汇编代码。下面是两种汇编主要的区别:
1.
AT&T中会在指令结尾用一个字母来表示操作数大小。其中:“b”表示byte;“w”表示word;“l ”表示long。
Intel只是在处理内存操作数时加上BYTE PTR、WORDPTR、DWORD PTR的前缀。
例如:
AT&T
movl % eax, %ebx
movl (% ebx), %eax
2.
AT&T中第一个操作数为源操作数,第二个操作数为目的操作数。
INTEL则相反,第一个是目的操作数,第二个是源操作数。
例如:
AT&T
movl % eax, %ebx
3.
AT&T 中使用寄存器要在名称前加‘%’号。
Intel 中则不需要。
例如:
AT&T
movl % eax, %ebx
4.
AT&T 中使用立即数和符号要在前面加‘$’号。
Intel 中则不需要。
例如:
AT&T
movl $5, %eax
5.
AT&T 中用于表示地址的寄存器放在 “()”中,
Intel则放在“[]”。
例如:
AT&T
movl -4(ebp), %eax
movl array(% ebx, % eax, 4), %ecx
6.
AT&T中跳转指令和子过程调用指令的操作码带有前缀“l“,分别为ljmp,lcall,lret。
例如:
AT&T
ljump0x400400
lcall0x4003e0
lret
7.
AT&T 中长跳转的格式和Intel有区别。
例如:
AT&T
ljump 0x3f3e,0x400400
lcall 0x3f3e,0x4003e0