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 に答える