【发布时间】:2018-06-17 22:42:13
【问题描述】:
我相当肯定我以前在代码中看到过这一点,但我找不到任何关于如何做到这一点的参考资料。我确实希望这是特定于编译器或汇编器的。
我想定义一个(编译时)固定长度的函数指针数组,用作嵌入式设备上的中断向量表。每个处理程序将在跳转到公共处理程序之前推送其中断号。为这些更简单的函数创建宏很简单:
.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
这可以通过使用宏来完成吗?
【问题讨论】:
-
rept 怎么样。请注意,这和您展示的是 gnu 汇编器 (
gas) 的汇编器指令,因此与gcc或预处理器无关。 -
虽然@Jester 或多或少是正确的,但与 GCC 和程序集之间存在关系,因为 GCC 将充当运行
as(gnu 汇编程序)的前端。有些人确实错误地认为这意味着 GCC 也是一个汇编程序。 -
您可以执行类似
.altmacro.set i, 0.rept 256irq %i.set i, i + 1.endr之类的操作。此处需要.altmacro指令才能使其工作 -
@MichaelPetch 这似乎可以解决问题。我会回来报告的。 .altmacro 不常见吗
-
.altmacro的使用在 GAS 开发人员中并不少见(有人可能会争辩说 GAS 在一般的装配开发中并不常见)。它是documented,供使用 GAS 的开发人员使用。我在自己的项目中使用过它。我们在这里使用.almacro,因此我们可以利用表达式结果作为字符串您可以编写'%expr'来评估表达式expr并将结果用作字符串。
标签: gcc assembly macros preprocessor