寫在前面
本文並不詳細介紹Intel syntax、AT&T syntax、GAS、NASM的具體內容和具體區別,而是從概念辨析的角度說明這些專有名詞的含義,以便為初學者掃清疑惑。有興趣深入了解相關知識的讀者請自行學習。
正文
1. Intel syntax vs AT&T syntax
- 這是兩種不同的匯編語法,可以簡單地認為是兩種不同的匯編語言[1]。
- Intel syntax主要用於DOS和Windows,而AT&T syntax主要用於UNIX[1,2]。
- AT&T是American Telephone and Telegraph的縮寫,AT&T是貝爾實驗室的創建者之一,而UNIX系統在貝爾實驗室誕生,因此UNIX下的匯編語言稱為AT&T syntax[3,4,5]。
- GNU的匯編器(即下文中的GAS)采用AT&T syntax,如 gcc -S filename.c 會生成AT&T syntax風格的匯編代碼文件filename.s,如果想要生成Intel syntax風格的匯編代碼,可以使用 gcc -S -masm=intel filename.c 命令。
- Intel syntax和AT&T syntax在編碼上最大也是最應引起注意的區別是:兩者指令的原操作數和目的操作數的位置正好是相反的。例如,Intel syntax下的指令 mov eax, 5 轉換為AT&T syntax下的對應指令應為 movl $5, %eax [1]。
2. GAS vs NASM
這是兩種不同的匯編器,
- GAS是GNU Assembler的簡寫,基於AT&T syntax指令,生成.s文件[6]。
- NASM是Netwide Assembler的簡寫,基於Intel syntax指令,生成.asm文件[6]。
- 還有其它匯編器,如MASM (Microsoft Macro Assembler)、FASM (Flat Assembler)、TASM (Turbo Assembler)、YASM (Yet Another Assembler)等。常見匯編器的對比如下圖所示(圖片來自參考資料7)[1,7]。
參考資料:
[1] Intel syntax vs AT&T syntax——wiki
[2] Intel syntax vs AT&T syntax——stackoverflow
[4] 貝爾實驗室——wiki
[5] 貝爾實驗室——知乎
[7] Hacker Disassembling Uncovered, 2nd ed——google book
結束語
本文未生產知識,只是知識的搬運工。但由於在下才疏學淺,錯誤紕漏之處依然在所難免,如果您在閱讀的過程中發現了本文的錯誤和不足,請您務必指出。您的批評指正就是在下前進的不竭動力!