如何在宏参数中获取变量的值
How to get the value of a variable in a macro argument
NASM 汇编中的工作代码如下:
%macro ISR_NOERRCODE 1
[GLOBAL isr%1]
isr%1:
...
%endmacro
%assign i 0 ; Initialize the loop Variable
%rep 8
ISR_NOERRCODE i
%assign i i+1
%endrep
扩展为 8 个代码块名称 isr1
、isr2
等。
但是在 GAS 语法中,给宏的参数似乎没有扩展。我的代码是:
.macro ISR_NOERRCODE n
.global isr\n
isr\n:
...
.endm
.set i, 0
.rept
ISR_NOERRCODE $i
.set i, $i + 1
.endr
导致汇编错误:
Error: symbol `isr$i' is already defined
因为宏似乎将 $i
参数作为文字字符串。
这在 GAS 语法中是否可行?
首先,您需要使用 .altmacro 指令来启用备用宏模式。其中一项新增功能是:
Expression results as strings
You can write %expr to evaluate the expression expr and use the result as a string.
因此,如果我们在宏参数前加上一个 % ,它将被评估为一个表达式并变成一个字符串,这就是我们在这里想要的。您的代码可能如下所示:
.altmacro
.macro ISR_NOERRCODE n
.global isr\n
isr\n:
...
.set i, 0
.rept 8
ISR_NOERRCODE %i
.set i, i + 1
.endr
相反,您可以使用默认设置 .noaltmacro 禁用备用宏模式。
NASM 汇编中的工作代码如下:
%macro ISR_NOERRCODE 1
[GLOBAL isr%1]
isr%1:
...
%endmacro
%assign i 0 ; Initialize the loop Variable
%rep 8
ISR_NOERRCODE i
%assign i i+1
%endrep
扩展为 8 个代码块名称 isr1
、isr2
等。
但是在 GAS 语法中,给宏的参数似乎没有扩展。我的代码是:
.macro ISR_NOERRCODE n
.global isr\n
isr\n:
...
.endm
.set i, 0
.rept
ISR_NOERRCODE $i
.set i, $i + 1
.endr
导致汇编错误:
Error: symbol `isr$i' is already defined
因为宏似乎将 $i
参数作为文字字符串。
这在 GAS 语法中是否可行?
首先,您需要使用 .altmacro 指令来启用备用宏模式。其中一项新增功能是:
Expression results as strings
You can write %expr to evaluate the expression expr and use the result as a string.
因此,如果我们在宏参数前加上一个 % ,它将被评估为一个表达式并变成一个字符串,这就是我们在这里想要的。您的代码可能如下所示:
.altmacro
.macro ISR_NOERRCODE n
.global isr\n
isr\n:
...
.set i, 0
.rept 8
ISR_NOERRCODE %i
.set i, i + 1
.endr
相反,您可以使用默认设置 .noaltmacro 禁用备用宏模式。