gpt4 book ai didi

assembly - 在 AArch64 的 GNU 汇编程序中打破长宏参数列表

转载 作者:行者123 更新时间:2023-12-02 01:45:45 26 4
gpt4 key购买 nike

我正在 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 :

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 风格汇编时的一个常见做法是在将源代码传递给汇编程序之前通过 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 预处理器还使您能够通过 #define 使用 C 风格的宏,以防有用。

关于assembly - 在 AArch64 的 GNU 汇编程序中打破长宏参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70930798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com