【发布时间】:2022-01-31 18:10:05
【问题描述】:
我正在用 GNU 汇编器编写针对 ARMv8 (AArch64) 的汇编代码。不确定这是否重要,但我直接在运行 Linux 的 ARMv8 目标(Raspberry Pi 板)中进行编码。
我有一个带有 非常 长参数列表的宏(例如,超过 60 个参数)——我知道,这是错误的,请不要开枪。
为了便于阅读,我想将这个参数列表分成多行,例如:
.macro my_macro arg1, arg2, arg3, arg4,
arg5, arg6, arg7, arg8,
// ...
arg61, arg62, arg63, arg64
// macro code goes here
.endm
我也想在实例化宏时做同样的事情。
不幸的是,一旦我尝试在宏声明中插入换行符,就会收到以下错误:
test.s: Assembler messages:
test.s:123: Error: Bad parameter list for macro `my_macro'
至于在宏实例化中插入换行符,虽然我没有直接收到错误,但代码并没有汇编,因为换行符之后的所有参数都被忽略了,即好像我用更少的宏实例化了参数超出预期,因此缺少的默认为空字符串。
根据the manual:
可以使用“;”字符代替换行符来分隔语句。
我尝试在每行末尾添加;,即:
.macro my_macro arg1, arg2, arg3, arg4, ;
arg5, arg6, arg7, arg8, ;
// ...
arg61, arg62, arg63, arg64
// macro code goes here
.endm
这没什么区别。宏实例化中的换行符也是如此。我还尝试了其他字符,例如#、@ 和//,但没有成功。
那么:是否可以在宏声明或实例化的参数列表中间插入换行符?
【问题讨论】:
-
你试过反斜杠 \ 像在 C 中一样吗?可以使用分号代替 换行符,因此任何一个都会有问题,而您同时使用这两个。分号在压缩结构或其他东西中使用
.byte 1 ; .word 2。 -
是的,忘了提这一点,尽管这是我尝试的第一件事,甚至在查看手册之前。添加反斜杠会导致“警告:杂散`\'”消息,以及已经提到的相同错误。
-
人们经常编写汇编程序源代码,在传递给汇编程序之前要通过 C 预处理器运行。如果您将文件命名为
foo.S并带有大写的 S,gcc命令会自动执行此操作。并且 C 预处理器确实处理反斜杠行继续,因此汇编器只会看到一个长行。 -
它还为您提供了使用 C 风格
#define宏的选项,以防它比汇编程序.macro更好地满足您的目的。 -
Asm 宏支持迭代。作为一个选项,您可能可以创建一个宏来生成
args列表,其中包含所需数量的数量。抱歉,很久没有这样做了,无法举出一个例子。
标签: assembly macros arm64 gnu-assembler