首页 > 解决方案 > GNU 汇编器宏

问题描述

我正在尝试在 GNU 汇编器 (2.26.1) (gcc 5.4.0) 中构建一个简单的宏,但在多次交互后出现一些错误:助记符中的无效字符 '('

我尝试使用 \() 或 & 遵循https://sourceware.org/binutils/docs/as/Macro.html上的建议,但没有运气。

    .macro macro_gen_irqh isrb, isre
    _irq_entry_\isrb\():
        cli
        call isr_common_handler
        .if  \isre-\isrb
           macro_gen_irqh    "(\isrb+1)",\isre
       .endif
    .endm

如果我将标签 _irq_entry_\isrb(): 替换为 "(\isrb)": 它确实适用于枚举,但没有所需的完整标签名称。

最终结果应该是:

_irq_entry_0:
   cli
   call isr_common_handler
_irq_entry_1:
.
.
_irq_entry_2:
.
.

标签: gccassemblyx86gnu-assemblerosdev

解决方案


如果您使用该.altmacro指令,您可以这样重写它:

.altmacro

.macro macro_gen_irqh isrb, isre
_irq_entry_\isrb:
    call isr_common_handler
    .if \isre-\isrb
        macro_gen_irqh %isrb+1,\isre
    .endif
.endm

altmacro进行了许多更改,但重要的是,如果您%在宏参数上使用,它将被视为表达式,结果将作为字符串返回。我在这一行中利用了这一点:

macro_gen_irqh %isrb+1,\isre

结果macro_gen_irqh 0 1将是:

_irq_entry_0:
    call isr_common_handler

_irq_entry_1:
    call isr_common_handler

推荐阅读