%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
。那么如何避免该字符串的多个定义呢?
答案 0 :(得分: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
答案 1 :(得分:1)
我不确定我是否认为在宏观中加入“你好世界”的意义。我认为你想传递文本作为参数打印到宏,不是吗?
%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"
%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"
那是未经测试的,但“类似的东西”......
最佳, 弗兰克