GAS ARM 目标下的注释语法歧义

Comment syntax ambiguity under GAS ARM target

GNU GAS 文档似乎未能正确定义 ARM 目标的某些语法功能,因此我在编写简单的汇编代码时遇到了困难。

两个这样的例子:

有什么地方可以找到 GAS + ARM 目标的具体和完整的语法定义吗? 提前致谢。

GAS 同时支持 // 注释和 @ 注释本身,即使不使用 C 预处理器来处理 C/C++ 风格的注释。

(用大写字母 S 调用你的文件 foo.S 并且 gcc -c foo.S 将首先通过 CPP 运行 它,所以你可以使用 #define#if 0诸如此类。)

"Encoded" 表示可以用机器代码表示。例如MOVK x1, #0x40000 不是 syntax 错误,它是比解析更晚的错误,因为无法用该操作码在机器代码中表示该特定数字。但是 mov x1, #0x40000 很好,因为汇编程序可以为 orr 选择一个位范围编码-立即使用 xzr。请注意,这是 AArch64,它使用与 ARM 不同的机器代码。

GAS ARM 语法与官方 ARM 手册文档相同。 指令与 Keil 的 ARMasm 不同,但指令的语法线条(大部分?)相同。 @old_timer 表示 mrcmcr 语法存在或曾经存在一些差异,但在大多数情况下,GAS 旨在与标准 ARM 语法兼容。

请参阅 GAS 手册的 ARM Dependent Features 章节,包括语法部分。

(请注意,ARM 有几种不同的语法模式,"unified" 与使用不同语法的旧模式相比,ARM 与 Thumb 模式。通常你需要 .syntax unified

您总是可以查看 GCC C 编译器输出的示例(例如 https://godbolt.org/z/Tk_jrD),尽管对于特定情况,您必须编写一个 C 函数,其中 GCC 将使用您的指令或寻址模式有兴趣。GCC 使用 GAS 指令。