【问题标题】:Gnu Assembler: Evaluate symbols in macro arguments?Gnu Assembler:评估宏参数中的符号?
【发布时间】:2020-01-03 20:11:37
【问题描述】:

在 GNU 汇编器 (v. 2.31.1) 中,我想将 .equ(或 .set)设置的符号传递给宏。 作为 ARM 上的示例,我想将整数符号转换为字符串:

.equ WIDTH, 100

.macro numToString label, num
\label :
.asciz "\num"
.equ \label\()Len, .-\label
.endm

numToString xyzWidthStr, WIDTH

但是,这会导致以 null 结尾的字符串“WIDTH”而不是“100”的标签“xyzWidthStr”。有没有办法强制宏在使用参数之前对其进行评估/替换?

【问题讨论】:

    标签: macros gnu-assembler


    【解决方案1】:

    有没有办法强制宏在使用参数之前对其进行评估/替换?

    你可以使用 C 预处理器来解决它

    #define WIDTH 100

    使用 arm-gcc(不是 arm-as)组装。如果文件扩展名是.S 或.sx,gcc 将在组装文件之前调用文件的C 预处理器。如果你使用不同的扩展,你可以

    arm-gcc -x assembler-with-cpp code.asm <options>

    如果您想查看中间的预处理代码,请将-save-temps 添加到<options>。 gcc 会将其保存到code.s。

    【讨论】:

    • 感谢您的回答!我知道 CPP 或 M4,但我对 GAS 宏是否可以用这种方式编写特别感兴趣。
    • 如果您更喜欢气体宏,那么将 WIDTH 定义为 .macro?
    • 那么对 numToString 的“调用”会是什么样子?如果这真的是唯一的方法,我会接受这个答案,因为不可能以我打算的方式将 GAS 宏与 .equ 一起使用。
    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2015-05-25
    相关资源
    最近更新 更多