GNU 汇编程序宏
GNU assembler Macros
我正在尝试在 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:
.
.
如果您使用 .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
我正在尝试在 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:
.
.
如果您使用 .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