【问题标题】:How to get the value of a variable in a macro argument如何在宏参数中获取变量的值
【发布时间】:2016-05-14 20:37:05
【问题描述】:

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 语法中是否可能?

【问题讨论】:

    标签: assembly x86 macros nasm gnu-assembler


    【解决方案1】:

    首先,您需要使用.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 禁用备用宏模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2013-10-04
      • 2014-10-01
      相关资源
      最近更新 更多