本文并不詳細介紹Intel syntax、AT&T syntax、GAS、NASM的具體内容和具體差別,而是從概念辨析的角度說明這些專有名詞的含義,以便為初學者掃清疑惑。
寫在前面
本文并不詳細介紹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]。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3MDM2gDNxgzNtADN2kDM1ETMyEDM2ATMyAjMtMjMyIDN28CX2ATMyAjMvw1MyIjM0YzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
參考資料:
[1] Intel syntax vs AT&T syntax——wiki
[2] Intel syntax vs AT&T syntax——stackoverflow
[3] AT&T Corporation——wiki
[4] 貝爾實驗室——wiki
[5] 貝爾實驗室——知乎
[6] GAS vs NASM——CSDN
[7] Hacker Disassembling Uncovered, 2nd ed——google book
結束語
本文未生産知識,隻是知識的搬運工。但由于在下才疏學淺,錯誤纰漏之處依然在所難免,如果您在閱讀的過程中發現了本文的錯誤和不足,請您務必指出。您的批評指正就是在下前進的不竭動力!