打破 AArch64 的 GNU 汇编器中的长宏参数列表

swi*_*one 3 macros assembly gnu-assembler arm64

我正在 GNU 汇编器中编写针对 ARMv8 (AArch64) 的汇编代码。不确定这是否重要,但我直接在运行 Linux 的 ARMv8 目标(Raspberry Pi 板)中进行编码。

\n

我有一个带有长参数列表的宏(例如,超过 60 个参数)——我知道,这是错误的,请不要开枪打我。

\n

为了便于阅读,我想将这个参数列表分成多行,即如下所示:

\n
.macro my_macro arg1, arg2, arg3, arg4,\n                arg5, arg6, arg7, arg8,\n                // ...\n                arg61, arg62, arg63, arg64\n\n    // macro code goes here\n\n.endm\n
Run Code Online (Sandbox Code Playgroud)\n

我也想在实例化宏时执行相同的操作。

\n

不幸的是,当我尝试在宏声明中插入换行符时,我收到以下错误:

\n
test.s: Assembler messages:\ntest.s:123: Error: Bad parameter list for macro `my_macro\'\n
Run Code Online (Sandbox Code Playgroud)\n

至于在宏实例化中插入换行符,虽然我没有直接收到错误,但代码不会汇编,因为换行符后面的所有参数都被忽略,即好像我用更少的参数实例化了宏比预期的要大,所以缺失的默认为空字符串。

\n

根据手册

\n
\n

可以使用 \xe2\x80\x98;\xe2\x80\x99 字符代替换行符来分隔语句。

\n
\n

;我尝试在每行末尾添加一个,即:

\n
.macro my_macro arg1, arg2, arg3, arg4, ;\n                arg5, arg6, arg7, arg8, ;\n                // ...\n                arg61, arg62, arg63, arg64\n\n    // macro code goes here\n\n.endm\n
Run Code Online (Sandbox Code Playgroud)\n

这没有什么区别。宏实例化中的换行符也是如此。我还尝试了其他字符,例如#@和,//但没有成功。

\n

那么:是否可以在宏声明或实例化中的参数列表中间插入换行符?

\n

Nat*_*dge 6

我不知道如何在汇编器本身中执行此操作。然而,编写 Unix 风格汇编时的常见做法是先通过 C 预处理器运行源代码,然后再将其传递给汇编器。如果您为源文件指定以大写 S 结尾gcc的名称,该命令将为您完成此操作,这是很常见的。.S

C 预处理器确实支持反斜杠续行,因此在这种情况下您可以编写

.macro my_macro arg1, arg2, arg3, arg4,     \
                arg5, arg6, arg7, arg8,     \
                // ...
                arg61, arg62, arg63, arg64  

    // macro code goes here
.endm
Run Code Online (Sandbox Code Playgroud)

整个.macro指令将被汇编器视为一行。

拥有 C 预处理器还使您能够使用带有 的 C 风格宏#define,以防万一有用。