【问题标题】:Defining variables within a macro causes multiple definitions of the same variable在宏中定义变量会导致同一变量的多个定义
【发布时间】:2012-06-22 15:12:32
【问题描述】:
%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."会有多个定义我可以定义没有@的字符串987654324@ 前缀,但如果宏将被多次使用,我会因为重新定义相同的符号 msg 而得到一个汇编错误。那么如何避免该字符串的多个定义呢?

【问题讨论】:

    标签: assembly macros nasm


    【解决方案1】:

    你可以这样做:

    %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
    

    【讨论】:

    • 请注意,section .text 将切换到 .text 部分,即使该部分不是在调用宏时处于活动状态的部分,也可能会破坏周围的代码。
    • 您可以切换回原始部分而不是无条件切换到.text,如nasm.us/doc/nasmdoc7.html#section-7.3/NASM Specific -- Section vs [SECTION ]所示
    • 这种避免重复定义的包含保护想法是一个很好的想法。如果宏的不同实例有不同的数据,您可以使用%%HWM:push %%HWM 来获取宏的每个扩展唯一的标签名称。
    【解决方案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"
    

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

    最好, 弗兰克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多