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. 那么如何避免该字符串的多个定义呢?

4

2 回答 2

3

你可以这样做:

%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
于 2012-06-22T21:45:52.200 回答
2

我不确定我是否看到将“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"

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

最好的,弗兰克

于 2012-06-22T21:45:08.717 回答