AT&T彙編格式介紹

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章