写在前面
本文并不详细介绍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
结束语
本文未生产知识,只是知识的搬运工。但由于在下才疏学浅,错误纰漏之处依然在所难免,如果您在阅读的过程中发现了本文的错误和不足,请您务必指出。您的批评指正就是在下前进的不竭动力!