在宏中定义变量会导致同一变量的多个定义

时间:2012-06-22 15:12:32

标签: assembly macros nasm

%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 个答案:

答案 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"

那是未经测试的,但“类似的东西”......

最佳, 弗兰克