匯編概念辨析(Intel/AT&T syntax、GAS、NASM)


寫在前面

本文並不詳細介紹Intel syntax、AT&T syntax、GAS、NASM的具體內容和具體區別,而是從概念辨析的角度說明這些專有名詞的含義,以便為初學者掃清疑惑。有興趣深入了解相關知識的讀者請自行學習。

正文

1. Intel syntax vs AT&T syntax

  1. 這是兩種不同的匯編語法,可以簡單地認為是兩種不同的匯編語言[1]
  2. Intel syntax主要用於DOS和Windows,而AT&T syntax主要用於UNIX[1,2]
  3. AT&T是American Telephone and Telegraph的縮寫,AT&T是貝爾實驗室的創建者之一,而UNIX系統在貝爾實驗室誕生,因此UNIX下的匯編語言稱為AT&T syntax[3,4,5]
  4. GNU的匯編器(即下文中的GAS)采用AT&T syntax,如 gcc -S filename.c 會生成AT&T syntax風格的匯編代碼文件filename.s,如果想要生成Intel syntax風格的匯編代碼,可以使用 gcc -S -masm=intel filename.c 命令。
  5. Intel syntax和AT&T syntax在編碼上最大也是最應引起注意的區別是:兩者指令的原操作數和目的操作數的位置正好是相反的。例如,Intel syntax下的指令 mov eax, 5 轉換為AT&T syntax下的對應指令應為 movl $5, %eax [1]

2. GAS vs NASM

這是兩種不同的匯編器,

  1. GAS是GNU Assembler的簡寫,基於AT&T syntax指令,生成.s文件[6]
  2. NASM是Netwide Assembler的簡寫,基於Intel syntax指令,生成.asm文件[6]
  3. 還有其它匯編器,如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

[3] AT&T Corporation——wiki

[4] 貝爾實驗室——wiki

[5] 貝爾實驗室——知乎

[6] GAS vs NASM——CSDN

[7] Hacker Disassembling Uncovered, 2nd ed——google book

結束語

本文未生產知識,只是知識的搬運工。但由於在下才疏學淺,錯誤紕漏之處依然在所難免,如果您在閱讀的過程中發現了本文的錯誤和不足,請您務必指出。您的批評指正就是在下前進的不竭動力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM