天天看點

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

本文并不詳細介紹Intel syntax、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]。
彙編概念辨析(Intel/AT&T syntax、GAS、NASM)
彙編概念辨析(Intel/AT&T syntax、GAS、NASM)

參考資料:

[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

結束語

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

繼續閱讀