Assembly 对于不同的体系结构,汇编语言语法是否相同

Assembly 对于不同的体系结构,汇编语言语法是否相同,assembly,syntax,language-design,Assembly,Syntax,Language Design,我知道我不能编写在所有机器上运行/编译的汇编语言,因为它们有不同的指令集、操作码、寄存器等。我的问题是,即使指令集不同,汇编语法(或它本身的语言)是什么任何体系结构都是一样的?有一个术语类似于高级汇编程序。 但是,现在使用它没有任何意义,因为正如本页所述: 高级汇编程序通常提供直接将一对一汇编成低级机器代码的指令,就像在任何汇编程序中一样 不同的体系结构通常提供不同的功能,如条件指令,这些指令无法映射到其他程序集 如果需要创建可移植代码,请使用C语言。它为您提供了许多创建低级程序的可能性。如果您

我知道我不能编写在所有机器上运行/编译的汇编语言,因为它们有不同的指令集、操作码、寄存器等。我的问题是,即使指令集不同,汇编语法(或它本身的语言)是什么任何体系结构都是一样的?

有一个术语类似于高级汇编程序。 但是,现在使用它没有任何意义,因为正如本页所述:

高级汇编程序通常提供直接将一对一汇编成低级机器代码的指令,就像在任何汇编程序中一样

不同的体系结构通常提供不同的功能,如条件指令,这些指令无法映射到其他程序集


如果需要创建可移植代码,请使用C语言。它为您提供了许多创建低级程序的可能性。如果您需要使用特定的体系结构特性,您可以使用内联汇编程序(在GCC中,它是扩展的ASM)。

大多数汇编程序都有广泛的相似之处。它总是以线为导向的,比如

[label:]  mnemonic [operand list]
尽管少数汇编器使用空格而不是逗号来分隔操作数

一些历史汇编程序根据起始列而不是通过标签名称后的
来区分标签和助记符。(因此,它们采用了良好的样式:标签位于最左侧,助记符缩进)标签定义了一个符号名称,以引用输出中的该位置。(在许多汇编程序中,一行上的非助记符本身也被视为标签,即使没有

一些语法将目标操作数放在最后,许多其他语法将其放在第一位,但就将行解析为标记的基本语法而言,这是一个语义问题,而不是语法问题

存在一些语法明显不同的汇编程序,比如指令看起来像C函数调用

大多数汇编器内置的宏处理器在不同的汇编器之间有很大的不同。指令名称,如
.long
vs.
dd
vs.
dword

经典的MIPS汇编程序具有,而不仅仅是在当前位置发出填充。(如果没有
.set noreorder
,汇编程序实际上会优化代码以填充分支延迟槽。)同样,这不是语法上的,而是
.align
含义上的一个很大的语义差异

除此之外,asm的每一行都在某个部分中汇编成0个或更多字节的输出,这是非常普遍的,与周围的行无关

我的问题是,即使指令集不同,汇编语法(或它本身的语言)对于任何体系结构都是相同的吗

就x86而言,有十几种不同的汇编器,每种都有自己的独特性,这使得它们都接受稍微不同的语言-有。。。很少有程序会使用所有这些x86汇编程序进行汇编

at&t的语法与英特尔的不同——目标优先与目标最后

指令有各种各样的要求:.proc、.endp等

与世界上大多数
.b
.w
.l
操作码后缀(有时没有
)相比,英特尔有着优美的
字节ptr
语法来确定操作码的大小/宽度

一些汇编器喜欢:after标签,而其他汇编器则不允许使用它(或者要求使用)

有些需要特殊字符来区分寄存器名称与其他标识符(例如,有些需要%前缀,有些需要$前缀),而有些则不需要

寻址模式的语法也有很大的不同,例如,在ARM的[]表示法中,括号后的常量位置异常表示指针变量更新

这还不包括操作码的名称

在intel上,我们使用调用函数的指令(捕获返回地址时将pc转移到函数)、MIPS&RISC V上的jal、bsr、jsr、bl、jms等等

调用系统调用的术语,有各种
syscall
ecall
trap
sc
int
swi
svc

简言之,汇编程序之间没有语言、语法或语法的标准化



至于相似性,广义上讲,有if goto条件分支(和无条件分支)的概念作为控制流构造的机制,有标签作为分支目标和数据目标的概念,每行一条指令(正如@Peter提到的),具有独立操作数的助记操作码-但这些相似性是概念上的,而不是语法上的。

汇编是一个抽象术语,描述任何低级编程语言,在这种语言中,语言中的指令与体系结构的机器码指令之间存在非常强的对应关系。摩托罗拉MC6800的汇编语言与另一个CPU的汇编语言不同。它们不仅不同,而且你会看到同一体系结构的不同汇编语言。我不是在尝试创建可移植代码。我知道汇编是特定于您所编码的体系结构的。当我阅读x86和arm组装教程时,我很好奇。我注意到它们是相似但不同的寄存器、命令等,所以我想知道这种逻辑在不同的平台上是否是一致的。因此,如果决定尝试为其他非arm/x86等设备进行汇编,我将不得不学习新命令,但汇编文件的语法(即数据和宏等)仍然相同。一旦学习了一个,下一个就更容易了,下一个就更容易了。指令集通常有简单的操作,加法、减法和或异或,读取内存位置,写入内存位置,等等。如果您试图从一个角度来看待它,那么这只是语法问题。但语法会有所不同