不同架构的汇编语言语法是否相同

ele*_*tai 2 syntax assembly language-design

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

Pet*_*des 5

大多数汇编程序之间存在广泛的相似之处。它总是面向行的,就像

[label:]  mnemonic [operand list]
Run Code Online (Sandbox Code Playgroud)

尽管一些汇编程序使用空格而不是逗号来分隔操作数。

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

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

存在一些语法显着不同的汇编器,例如x86 HLA,其中指令看起来像 C 函数调用。

大多数汇编器内置的宏处理器在汇编器之间存在显着差异。指令名称如.longvs. ddvs. dword

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

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

  • @TonyK:我是说有一种最常用的主要通用语法(无论语义差异如何),还有一些汇编器甚至在语法上做了不同的事情。当我查看以前从未见过的 ISA 的 asm 时,总是很明显什么是助记符以及什么是(显式)操作数。我并不总是知道操作数是寄存器名称还是该助记符的一些特殊立即修饰符,但就语法而言,这并不令人惊讶。 (2认同)