gcc - GCC中汇编文件的for循环宏/预处理器

标签 gcc assembly macros preprocessor

我相当肯定我以前在代码中看到过这一点,但我找不到任何关于如何做到这一点的引用资料。我确实希望这是特定于编译器或汇编器的。

我想定义一个(编译时)固定长度的函数指针数组,用作嵌入式设备上的中断向量表。每个处理程序将在跳转到公共(public)处理程序之前推送其中断号。为这些更简单的函数创建一个宏很简单:

.macro irq number
    .global irq\number
    irq\number:
    pushd $\number
    jmp irq_handler_common
.endm

然后可以像这样手动定义这些:
irq 0
irq 1
irq 2
...

但是,我不想通过手动定义其中的 256 个来弄乱我的 ASM 文件。因此,我想做的是使用像预处理器/宏这样的 for 循环,它可以让我做这样的事情:
for i in 0 ... 255
    irq i

这可以通过使用宏来完成吗?

最佳答案

使用 @MichaelPetch 的建议和 @Jester我已经编译了以下工作解决方案(需要使用 GNU Assembler for altmacro 或其他支持的汇编程序)。不幸的是,我不得不创建两个宏,一个用于实例化中断入口点 stub ,另一个用于帮助创建这些入口地址的向量。我在观察 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

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

.section .text
.set i,0
.rept 256
    irq_stubX %i
    .set i,i+1
.endr

最后,使用另一个宏,创建我们刚刚在上面创建的标签的向量。
.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

供引用,这个不行,报上面提到的错误:
default_handlers:
.set i,0
.rept 256
    .long irq %i
    .set i, i+1
.endr

编辑 .根据 @RossRidge's,解决方案可以变得更小更清晰下面的建议。
.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

关于gcc - GCC中汇编文件的for循环宏/预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48159005/

相关文章:

gcc - 在 OS X 10.9 Mavericks 上编译 Mesos 时如何修复 "implicit instantiation"错误?

使用 malloc 或堆栈的 C sprintf 函数

assembly - RISCV中如何表示乘法指令的乘积?

assembly - 汇编中的 MUL 运算

使用宏连接整数

c++ - 将 AVX 与 GCC : __builtin_ia32_addpd256 not declared 一起使用

配置 $(CC) 以在可以安全删除包含时发出警告

c - 中断处理程序在真实计算机上不起作用

c - 特定于函数的 C 宏是否应该在函数范围内定义和取消定义?

Python Jinja2 调用宏导致(不希望的)换行