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 Intel
movl % eax, %ebx movebx, eax
movl (% ebx), %eax mov eax, dword ptr [ebx]
2. 操作数方向
AT&T中第一个操作数为源操作数,第二个操作数为目的操作数。
INTEL则相反,第一个是目的操作数,第二个是源操作数。
例如:
AT&T Intel
movl % eax, %ebx mov ebx, eax
3. 寄存器表示法
AT&T 中使用寄存器要在名称前加‘%’号。
Intel 中则不需要。
例如:
AT&T Intel
movl % eax, %ebx mov ebx, eax
4. 立即数和符号表示法
AT&T 中使用立即数和符号要在前面加‘$’号。
Intel 中则不需要。
例如:
AT&T Intel
movl $5, %eax mov eax, 5
5. 寄存器间址表示法
AT&T 中用于表示地址的寄存器放在 “()”中,
Intel则放在“[]”。
例如:
AT&T Intel
movl -4(ebp), %eax moveax, [ebp-4]
movl array(% ebx, % eax, 4), %ecx mov ecx, [ebx + 4*eax + array]
6. 跳转指令
AT&T中跳转指令和子过程调用指令的操作码带有前缀“l“,分别为ljmp,lcall,lret。
例如:
AT&T Intel
ljump0x400400 jmp 0x400400
lcall0x4003e0 call0x4003e0
lret ret
7. 长跳转指令
AT&T 中长跳转的格式和Intel有区别。
例如:
AT&T Intel
ljump 0x3f3e,0x400400 jmp far 0x3f3e:0x400400
lcall 0x3f3e,0x4003e0 callfar 0x3f3e:0x4003e0