c++ - 汇编语法和平台之间的关系是什么

标签 c++ assembly x86 cross-compiling

在此youtube video这家伙解释说有两种类型的汇编语法——Intel 和 AT&T。汇编语法和平台之间是否存在关系(例如英特尔平台汇编器只接受英特尔汇编语法)?

最佳答案

没有任何联系。汇编语言语法由汇编器定义,汇编器是解析它的程序。机器代码是唯一必须遵守的真正标准。例如,尽管人们喜欢谈论两种 x86 语法,但实际上还有很多,因为语法涵盖了所有文本,而不仅仅是操作数的顺序。出于同样的原因,ARM 有多种语法,其他语法也有。

定义指令集符合芯片或 ip 供应商的利益,同时符合他们的利益,用汇编语言语法来呈现它,或者至少在指令方面(还有很多到汇编语言而不仅仅是指令,在指令本身的 x86 变化的情况下,而不仅仅是操作数的排序),并且这些供应商至少为他们制造或已经为他们制造了所需的汇编器和链接器(在他们最好的情况下)兴趣)。他们的文档和这个特定的汇编器完美匹配(符合他们的最大利益)。但是标准化就此止步,下一个制作汇编器的人/团队只需要符合机器代码,并且通常会至少进行细微的更改,使代码不兼容(有意或无意,为什么要制作完美的克隆)。无论出于何种原因,gas 实现往往会从芯片/ip 供应商创建不兼容的语言,除非 gas 版本是供应商驱动的初始版本(例如 risc-v)

语法连接和二进制文件格式(elf、coff 等)对于工具链来说很重要。出于显而易见的原因,编译器输出汇编语言然后启动汇编器,因此编译器生成的代码需要与该链中汇编器的语法相匹配。同样,汇编器输出的目标文件格式需要与链接器的格式相匹配,我假设像 gnu ld 这样的链接器实际上并不依赖汇编器来修补链接期间使用的机器码,只是直接修改机器码(或添加机器码根据需要编写代码,尽管在那种情况下可能确实使用汇编语言,但没有亲自检查/测试/确认)。

有人可能会争辩说,因为汇编器出现在编译器符合汇编器的编译器之前,如果是同一个人,那么可能会将项目添加到汇编器以帮助整体工具链解决方案,但会期望汇编器因此汇编语言作为一个整体是第一位的。

最后,作为程序员,我们希望安装的编译器能够为该系统/平台生成程序。 Linux 机器上的 gcc 使工作程序 gcc hello.c -o hello。我们无需为该平台进行引导和链接,这通常来自 C 库,但取决于工具链的设计,从头到尾的每个人都可能必须了解系统。

关于c++ - 汇编语法和平台之间的关系是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46510950/

相关文章:

c++ - 插入 C++ vector 时调用构造函数和析构函数

assembly - 屏蔽除以 0 异常程序集 masm

c++ - 在c++中使用x86 DIV的asm block 有什么用?

assembly leal 和 movl 的区别

c - 通过 x86 汇编进行零除检查的 C 除法宏

c++ - 开始智能卡编程

C++:将值赋给原始数据类型(例如 bool)是原子操作吗?

组装我们需要结局吗?

c++ - 与调用函数相比,goto 语句是否有效?

c++ - sprintf 比 print 占用更多空间?