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?
使用@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)