【问题标题】:Breaking long macro argument list in GNU assembler for AArch64在 AArch64 的 GNU 汇编器中打破长宏参数列表
【发布时间】: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


【解决方案1】:

我不知道在汇编程序本身中执行此操作的方法。但是,编写 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 预处理器还使您能够将 C 风格的宏与 #define 一起使用,以防万一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 2021-08-13
    • 2017-01-04
    • 2022-10-15
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多