GAS ARM 目标下的注释语法歧义
Comment syntax ambiguity under GAS ARM target
GNU GAS 文档似乎未能正确定义 ARM 目标的某些语法功能,因此我在编写简单的汇编代码时遇到了困难。
两个这样的例子:
ARM Compiler Migration and Compatibility Guide Version 6.02 指出,以及多行注释,在 GNU 语法下:
The //
marker identifies the remainder of a line as a comment:
MOV R0,#16 // Load R0 with 16
这似乎与 Using as 指南冲突,其中指出:
The presence of a ‘@’ anywhere on a line indicates the start of a comment that extends to the end of that line.
指令中的隐式移位问题仅在传入Arm文档时得到解决,并且仅给出失败的情况:
GNU syntax assembly expects immediate values to be presented as encoded. The instruction MOVK x1, #0x40000
results in the following message: error: immediate must be an integer in range [0, 65535].
"encoded"到底是什么意思?我是否假设 LSL
语法在 GNU 下得到相同的支持?它似乎没有在 GAS 文档中解决。
有什么地方可以找到 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 表示 mrc
和 mcr
语法存在或曾经存在一些差异,但在大多数情况下,GAS 旨在与标准 ARM 语法兼容。
请参阅 GAS 手册的 ARM Dependent Features 章节,包括语法部分。
(请注意,ARM 有几种不同的语法模式,"unified" 与使用不同语法的旧模式相比,ARM 与 Thumb 模式。通常你需要 .syntax unified
)
您总是可以查看 GCC C 编译器输出的示例(例如 https://godbolt.org/z/Tk_jrD),尽管对于特定情况,您必须编写一个 C 函数,其中 GCC 将使用您的指令或寻址模式有兴趣。GCC 使用 GAS 指令。
GNU GAS 文档似乎未能正确定义 ARM 目标的某些语法功能,因此我在编写简单的汇编代码时遇到了困难。
两个这样的例子:
ARM Compiler Migration and Compatibility Guide Version 6.02 指出,以及多行注释,在 GNU 语法下:
The
//
marker identifies the remainder of a line as a comment:MOV R0,#16 // Load R0 with 16
这似乎与 Using as 指南冲突,其中指出:
The presence of a ‘@’ anywhere on a line indicates the start of a comment that extends to the end of that line.
指令中的隐式移位问题仅在传入Arm文档时得到解决,并且仅给出失败的情况:
GNU syntax assembly expects immediate values to be presented as encoded. The instruction
MOVK x1, #0x40000
results in the following message:error: immediate must be an integer in range [0, 65535].
"encoded"到底是什么意思?我是否假设
LSL
语法在 GNU 下得到相同的支持?它似乎没有在 GAS 文档中解决。
有什么地方可以找到 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 表示 mrc
和 mcr
语法存在或曾经存在一些差异,但在大多数情况下,GAS 旨在与标准 ARM 语法兼容。
请参阅 GAS 手册的 ARM Dependent Features 章节,包括语法部分。
(请注意,ARM 有几种不同的语法模式,"unified" 与使用不同语法的旧模式相比,ARM 与 Thumb 模式。通常你需要 .syntax unified
)
您总是可以查看 GCC C 编译器输出的示例(例如 https://godbolt.org/z/Tk_jrD),尽管对于特定情况,您必须编写一个 C 函数,其中 GCC 将使用您的指令或寻址模式有兴趣。GCC 使用 GAS 指令。