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