gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:30:44 34 4
gpt4 key购买 nike

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

我想定义一个(编译时)固定长度的函数指针数组,用作嵌入式设备上的中断向量表。每个处理程序将在跳转到公共(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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com