在 AArch64 的 GNU 汇编程序中打破长宏参数列表
Breaking long macro argument list in GNU assembler for AArch64
我正在 GNU assembler 中编写针对 ARMv8 (AArch64) 的汇编代码。不确定这是否重要,但我直接在我的 ARMv8 目标(Raspberry Pi 板)中编码 运行 Linux.
我有一个带有 非常 长参数列表的宏(例如,超过 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'
至于在宏实例化中插入换行符,虽然我没有直接报错,但是代码中并没有assemble,因为换行符后的所有参数都被忽略了,即好像我已使用比预期更少的参数实例化宏,因此缺少的参数默认为空字符串。
根据the manual:
The ‘;’ character can be used instead of a newline to separate statements.
我尝试在每一行的末尾添加一个;
,即:
.macro my_macro arg1, arg2, arg3, arg4, ;
arg5, arg6, arg7, arg8, ;
// ...
arg61, arg62, arg63, arg64
// macro code goes here
.endm
这没有区别。宏实例化中的换行符也是如此。我还尝试了其他字符,例如 #
、@
和 //
,但没有成功。
那么:是否可以在宏声明或实例化中的参数列表中间插入换行符?
我不知道在汇编程序中执行此操作的方法。但是,编写 Unix-style 汇编时的常见做法是 运行 在将源代码传递给汇编器之前通过 C 预处理器。如果你给你的源文件一个以 .S
结尾的大写 S.
的名字,gcc
命令会为你做这件事是很常见的
C 预处理器确实支持反斜线续行,所以在那种情况下你可以这样写
.macro my_macro arg1, arg2, arg3, arg4, \
arg5, arg6, arg7, arg8, \
// ...
arg61, arg62, arg63, arg64
// macro code goes here
.endm
和整个 .macro
指令将被汇编程序视为单行。
拥有 C 预处理器还使您能够将 C-style 宏与 #define
一起使用,以防有用。
我正在 GNU assembler 中编写针对 ARMv8 (AArch64) 的汇编代码。不确定这是否重要,但我直接在我的 ARMv8 目标(Raspberry Pi 板)中编码 运行 Linux.
我有一个带有 非常 长参数列表的宏(例如,超过 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'
至于在宏实例化中插入换行符,虽然我没有直接报错,但是代码中并没有assemble,因为换行符后的所有参数都被忽略了,即好像我已使用比预期更少的参数实例化宏,因此缺少的参数默认为空字符串。
根据the manual:
The ‘;’ character can be used instead of a newline to separate statements.
我尝试在每一行的末尾添加一个;
,即:
.macro my_macro arg1, arg2, arg3, arg4, ;
arg5, arg6, arg7, arg8, ;
// ...
arg61, arg62, arg63, arg64
// macro code goes here
.endm
这没有区别。宏实例化中的换行符也是如此。我还尝试了其他字符,例如 #
、@
和 //
,但没有成功。
那么:是否可以在宏声明或实例化中的参数列表中间插入换行符?
我不知道在汇编程序中执行此操作的方法。但是,编写 Unix-style 汇编时的常见做法是 运行 在将源代码传递给汇编器之前通过 C 预处理器。如果你给你的源文件一个以 .S
结尾的大写 S.
gcc
命令会为你做这件事是很常见的
C 预处理器确实支持反斜线续行,所以在那种情况下你可以这样写
.macro my_macro arg1, arg2, arg3, arg4, \
arg5, arg6, arg7, arg8, \
// ...
arg61, arg62, arg63, arg64
// macro code goes here
.endm
和整个 .macro
指令将被汇编程序视为单行。
拥有 C 预处理器还使您能够将 C-style 宏与 #define
一起使用,以防有用。