2016-02-05 2 views
1

Рабочий код в сборке 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?

ответ

2

Во-первых, вам нужно использовать директиву .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, который по умолчанию.

+0

Работает как очарование, спасибо большое! – Gargamel

Смежные вопросы