AT&T 與Intel 彙編語法比較

 任何一個操作系統的源代碼中總是少不了彙編語言,因此彙編語言是學習操作系統必備的基礎知識,然而目前國內的教學大多是在Windows 平臺上進行的,因此大多數讀者熟悉的是Intel 的彙編語法,但是在Linux 內核代碼中使用的卻是AT&T 的彙編。本節對這兩種彙編進行對比,讓已經熟悉Intel 彙編語法的讀者快速掌握AT&T 的彙編。
1. 前綴

        在Intel 彙編語法中,寄存器和立即數都沒有前綴,但是在AT&T 的彙編語法中,寄存器的前綴爲"%",而立即數的前綴爲"$"。兩種格式的區別如下例所示:
----------------------------------------------------------------------------
                      代碼片段2.1 Intel 與AT&T 彙編格式比較
# EAX <= 8
MOV EAX, 8 (Intel)
movl $8, %eax (AT&T)

# EAX <= EBX
MOV EAX, EBX (Intel)
movl %EBX, %EAX (AT&T)
------------------------------------------------------------------------

2. 操作數方向
        Intel 彙編和AT&T 的操作數方向相反,Intel 彙編中的第一個操作數爲目的操作數,而第二個操作數爲源操作數,而AT&T 彙編語法中,第一個數爲源操作數,第二個數爲目的操作數。從上面的例子可以看出它們之間的區別。

3. 操作數位寬
        Intel 彙編中,由特定的字符指定操作數的位寬,例如"BYTE PTR","WORD PTR", "DWORDPTR" 來表示。在AT&T 彙編中,由操作碼最後一個字符來指定操作數的位寬,b,w,l 分別代表8 位,16 位,32 位。下面的例子說明了它們的區別:
------------------------------------------------------------------------
               代碼片段2.2 Intel 與AT&T 彙編格式比較
MOV AL, BYTE PTR BAR (Intel)
movb %al, BAR (AT&T)
------------------------------------------------------------------------

4. 間接尋址方式
         Intel 和AT&T 的間接尋址格式如下所示:
------------------------------------------------------------------------
             代碼片段2.3 Intel 與AT&T 彙編格式比較

1 SEGREG:[BASE+INDEX*SCALE+DISP] (Intel)
2 segreg:disp(base, index, scale) (AT&T)
上面的例子是間接尋址的通用形式,爲了方便理解,我們舉一個例子對這個通用形式
進行解釋,假設有下面這樣的一個結構體數組:
struct test {
int a;
int b;

  };

struct test bar[10];
------------------------------------------------------------------------
        假設現在要訪問數組第6 項中的成員b,使用默認的段寄存器,那麼它對應的彙編代
碼如下:
------------------------------------------------------------------------
             代碼片段2.4 Intel 與AT&T 彙編格式比較

# BASE 表示數組基地址,對應本例中的bar。
# INDEX 爲數組索引,對應本例中的第6 項,就是51。
# SCALE 是結構體的大小,本例中大小爲8 個字節。
# DISP 是結構體內的偏移量,本例中b 的偏移量爲4。
MOV EAX, DWORD PTR [bar+5*8+4] (Intel)
movl 4(bar,5,8), %eax (AT&T)
------------------------------------------------------------------------
        從這裏可以看出,Intel 語法相對直觀,通用形式中的SCALE,INDEX 等都可以爲空,例如以下是常見的形式。
------------------------------------------------------------------------
              代碼片段2.5 Intel 與AT&T 彙編格式比較

MOV EAX, DWORD PTR [ebp+20h] (Intel)
movl 0x20(%ebp), %eax, (AT&T)
------------------------------------------------------------------------
注意:數組下標從0 開始
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章