天天看點

彙編在不同寫法對比

絕大多數 Linux 程式員以前隻接觸過DOS/Windows 下的彙編語言,這些彙編代碼都是 Intel 風格的。但在 Unix 和 Linux 系統中,更多采用的還是 AT&T 格式,兩者在文法 格式上有着很大的不同:

1 在 AT&T 彙編格式中,寄存器名要加上 ‘%’ 作為字首;而在 Intel 彙編格式中,寄存 器名不需要加字首。例如:

2 在 AT&T 彙編格式中,用 ‘$’ 字首表示一個立即操作數;而在 Intel 彙編格式中,立 即數的表示不用帶任何字首。例如:

3AT&T 和 Intel 格式中的源操作數和目标操作數的位置正好相反。在 Intel 彙編格式 中,目标操作數在源操作數的左邊;而在AT&T 彙編格式中,目标操作數在源操作數的 右邊。例如:

4 在 AT&T 彙編格式中,操作數的字長由操作符的最後一個字母決定,字尾’b’、‘w’、‘l’ 分别表示操作數為位元組(byte,8 比特) 、字(word,16 比特)和長字(long,32比特) ; 而在 Intel 彙編格式中,操作數的字長是用 “byte ptr” 和 “word ptr” 等字首來表示的。 例如:

5 在 AT&T 彙編格式中,絕對轉移和調用指令(jump/call)的操作數前要加上’'作為前 綴,而在 Intel 格式中則不需要。

6 遠端轉移指令和遠端子調用指令的操作碼,在 AT&T 彙編格式中為 “ljump” 和 “lcall”,而在 Intel 彙編格式中則為 “jmp far” 和 “call far”,即:

與之相應的遠端傳回指令則為:

7 在 AT&T 彙編格式中,記憶體操作數的尋址方式是 section:disp(base, index, scale)

而在 Intel 彙編格式中,記憶體操作數的尋址方式為: section:[base + indexscale + disp]

由于 Linux 工作在保護模式下,用的是 32 位線性位址,是以在計算位址時不用考慮段 基址和偏移量,而是采用如下的位址計算方法:

disp + base + index * scale