程序集语法和平台之间有什么关系

时间:2017-10-01 09:18:10

标签: c++ assembly x86 cross-compiling

在这个youtube video中,这个人解释说有两种类型的汇编语法 - 英特尔和AT& T.汇编语法和平台之间是否存在关系(例如,intel平台汇编器只接受英特尔汇编语法)?

2 个答案:

答案 0 :(得分:3)

没有任何联系。汇编语言语法由汇编程序定义,汇编程序是解析它的程序。机器代码是唯一必须符合的真正标准。虽然人们喜欢谈论两个x86语法,但是由于语法包含所有文本而不仅仅是操作数的排序,因此还有很多。 ARM有多种语法,其他语法也是如此。

定义指令集符合芯片或ip供应商的利益,同时为了他们的兴趣,使用汇编语言语法,或者至少就指令而言(还有更多)汇编语言而不仅仅是指令,在指令本身的x86变体的情况下,而不仅仅是操作数的排序),这些供应商至少根据需要制作或者制作了汇编程序和链接器(最好的)利益)。他们的文档和这个特定的汇编程序理想地匹配(符合他们的最佳利益)。但是标准化在那里停止,下一个制作汇编程序的人/团队只需要符合机器代码,并且通常至少会做出微妙的变化,使代码不兼容(有意或无意,为什么要打造一个完美的克隆)。无论出于何种原因,气体实施倾向于从芯片/ IP供应商创建不兼容的语言,除了气体版本是供应商驱动的初始版本的情况(例如,例如risc-v)

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

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

最后,我们作为程序员期望安装的编译器为该系统/平台生成程序。 linux机器上的gcc使得工作程序gcc hello.c -o hello。如果没有我们必须为该平台进行引导和链接,并且通常来自C库,但取决于工具链的设计,从头到尾的每个人都可能必须是系统感知的。

答案 1 :(得分:0)

我回答以防其他人犯了这个错误。正如科迪·格雷评论的那样,英特尔和AT& T都是事实上的英特尔X86汇编语言。

资源: