如何在宏参数中获取变量的值

时间:2016-02-05 00:47:13

标签: assembly macros gas

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个代码块名称isr1isr2等。 但是在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语法中是否可行?

1 个答案:

答案 0 :(得分:3)

首先,您需要使用.altmacro指令启用备用宏模式。其中一个增加的功能是:

  

表达式结果为字符串

     

您可以编写%expr来计算表达式expr并将结果用作字符串。

因此,如果我们使用%前缀我们的宏参数,它将被评估为表达式并转换为字符串,这就是我们想要的。您的代码可能如下所示:

.altmacro

.macro ISR_NOERRCODE n
    .global isr\n
    isr\n:
         ...

.set i, 0 
.rept 8
    ISR_NOERRCODE %i
    .set i, i + 1 
.endr

相反,您可以使用默认的.noaltmacro禁用备用宏模式。