For-loop macro/preprocessor for assembly files in GCC

she*_*lbc 4 macros assembly gcc preprocessor

I am fairly certain I have seen this in code before, but I am unable to find any references on how to do it. I do expect this to be compiler or assembler specific.

I want to define an function pointer array of (compile-time) fixed length for use as an interrupt vector table on an embedded device. Each handler will push its interrupt number before jumping to a common handler. Creating a macro for these simpler functions is straight forward:

.macro irq number
    .global irq\number
    irq\number:
    pushd $\number
    jmp irq_handler_common
.endm
Run Code Online (Sandbox Code Playgroud)

These can then be defined manually like this:

irq 0
irq 1
irq 2
...
Run Code Online (Sandbox Code Playgroud)

However, I would rather not clutter my ASM file by manually defining 256 of these. Thus, what I would like to do is use an for-loop like preprocessor/macro that would allow me to do something like this:

for i in 0 ... 255
    irq i
Run Code Online (Sandbox Code Playgroud)

Can this be done in using macros?

she*_*lbc 7

使用@MichaelPetch@Jester 的建议,我编译了以下工作解决方案(需要使用 GNU 汇编器 foraltmacro或其他支持汇编器)。不幸的是,我不得不创建两个宏,一个用于实例化中断入口点存根,另一个用于帮助创建这些入口地址的向量。我正在观察Error: invalid operands (*UND* and *ABS* sections) for %是否尝试.long irq %i.rept创建的default_handlers. 如果有人有更小/更简单的解决方案,请发布!

定义特定于每个处理程序条目的入口点

.macro irq_stubX number
    irq\number:
    pushd $\number
    jmp irq_handler_common
.endm
Run Code Online (Sandbox Code Playgroud)

使用这个宏(和altmacro),创建 256 个实例

.altmacro

.section .text
.set i,0
.rept 256
    irq_stubX %i
    .set i,i+1
.endr
Run Code Online (Sandbox Code Playgroud)

最后,使用另一个宏,创建我们刚刚在上面创建的标签的向量。

.section .data
.macro irq_labelX number
    .long irq\number
.endm

default_handlers:
.set i,0
.rept 256
    irq_labelX %i
    .set i, i+1
.endr
Run Code Online (Sandbox Code Playgroud)

作为参考,这不起作用并报告上述错误:

default_handlers:
.set i,0
.rept 256
    .long irq %i
    .set i, i+1
.endr
Run Code Online (Sandbox Code Playgroud)

编辑。根据下面@RossRidge 的建议,该解决方案可以变得更小、更清晰。

.altmacro

.macro irq_insertX number
    .section .text
    irq_stubX \number

    .section .data
    .long irq\number
.endm

.section .data
default_handlers:
.set i,0
.rept 256
    irq_insertX %i
    .set i, i+1
.endr
Run Code Online (Sandbox Code Playgroud)