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

Assembly 在宏中定义变量会导致同一变量的多个定义,assembly,macros,nasm,Assembly,Macros,Nasm,问题是每次宏出现在程序中时,NASM预处理器都会为标签msg发明一个新名称,同一个字符串将有多个定义“Hello,world。”我可以定义没有%%前缀的字符串,但是如果宏将被多次使用,重新定义相同的符号时,我将收到一个汇编错误,msg。那么,如何避免该字符串的多个定义呢?我不确定在宏中添加“hello world”有什么意义。我想你应该想把要打印的文本作为参数传递给宏,不是吗 %macro printhello 0 section .rodata %%msg: db "Hello,

问题是每次宏出现在程序中时,NASM预处理器都会为标签
msg
发明一个新名称,同一个字符串将有多个定义
“Hello,world。”
我可以定义没有
%%
前缀的字符串,但是如果宏将被多次使用,重新定义相同的符号时,我将收到一个汇编错误,
msg
。那么,如何避免该字符串的多个定义呢?

我不确定在宏中添加“hello world”有什么意义。我想你应该想把要打印的文本作为参数传递给宏,不是吗

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

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

最好的,
弗兰克

我不确定我是否明白在宏中添加“hello world”的意义。我想你应该想把要打印的文本作为参数传递给宏,不是吗

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

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

最好的,
弗兰克

你可以这样做:

%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"

请注意,
section.text
将切换到
.text
部分,即使该部分在调用宏时不是活动的部分,可能会破坏周围的代码。请注意,
section.text
将切换到
.text
部分,即使该部分在调用宏时不是活动的,也可能会破坏周围的代码。