2012-06-22 188 views
0
%macro printhello 0 
    section .rodata 
    %%msg: db "Hello, world.", 10, 0 
    section .text 
     push %%msg 
     call printf 
     add esp, 4 
%endmacro 

的問題是,每一個宏出現在節目的時候,NASM預處理器將爲標籤msg創造一個新名稱,將有多重定義相同的字符串"Hello, world."我可以定義沒有%%前綴的字符串,但是如果該宏將被多次使用,則會重新定義相同的符號msg會出現程序集錯誤。那麼如何避免該字符串的多個定義?定義變量導致同一個變量的多個定義

回答

2

你可以做這樣的事情:

%macro printhello 0 
    %ifndef HelloWorldMsg 
    %define HelloWorldMsg 
    section .rodata 
HWM: db "Hello, world.", 10, 0 
    %endif 
    section .text 
     push HWM 
     call printf 
     add esp, 4 
%endmacro 
+0

注意'節.text'將切換到'.text'節,即使這不是在宏被調用時處於活動狀態的節,也可能會破壞周圍的代碼。 – BeeOnRope

1

我不確定我看到在宏中放入「hello world」這一點。我應該認爲你想將文本作爲參數傳遞給宏,否?

%macro printhello 1 
section .rodata 
%%msg: db %1, 10, 0 
section .text 
    push %%msg 
    call printf 
    add esp, 4 
%endmacro 

section .text 
_start ; (?) 
printhello "hello world" 
printhello "goodbye cruel world" 

這是未經測試,但 「類似的東西」 ......

最佳, 弗蘭克