在MASM中调用宏

时间:2017-01-20 22:31:56

标签: assembly macros masm

我遇到了麻烦。 MASM宏似乎根本不像C宏。 C有一个预处理器,它将文本作为一系列标记处理,你可以在任何地方放置一个宏调用。似乎在MASM中并非如此。我无法为此找到合适的doc,但你不能在指令中调用一个宏,对吧?除非它是另一个宏调用中的部分语句?或者它在宏def中出现?那是唯一的例外吗? spec / doc在哪里?

好的,我正在尝试做的是:

external macro fnames:VARARG
extern stdin:qword,
for fname, <fnames>
    fname&_ptr: qword,
endm
endm

external puts, fgets, printf, srand, rand

我得到: 语法错误:for

似乎已经解释了extern指令并找到了不允许的for macro =&gt;语法错误。

我该怎么办?如果用逗号结束每一行,你可以将指令拆分成几行,对吧?但如果它不解释宏调用无论如何都没有帮助。

我发现我能做到:

external macro fnames:VARARG
extern stdin:qword
for fname, <fnames>
    extern fname&_ptr: qword
endm
endm

external puts, fgets, printf, srand, rand

但是增加指令并不总是一种选择。采用proc指令f.ex.我几次不能将proc头用于同一个proc。

这种困境是否有明智的解决方案?是否可以使用MASM宏来生成单行输出?我不知道怎么回事。赶紧去救援,你所有的书呆子! :) Cheerioh

2 个答案:

答案 0 :(得分:4)

EXTERN directive的签名是

EXTERN [[    langtype]] name [[(altid)]] : type 
       [[, [[langtype]] name [[(altid)]] : type]]...

因此,您可以使用CATSTR directive创建一个单行代码:

external MACRO fnames:VARARG
  txt textequ <stdin: qword>
  for fname, <fnames>
    txt CATSTR txt, <, &fname&_ptr: qword>
  endm
  extern txt
endm

external puts, fgets, printf, srand, rand

它的输出是一行:

extern stdin: qword, puts_ptr: qword, fgets_ptr: qword, printf_ptr: qword, srand_ptr: qword, rand_ptr: qword

此外,如果您想使用MACRO的输出作为另一个MACRO,参数或表达式的输入,您可以使用EXITMhttps://msdn.microsoft.com/en-us/library/tb4885hc(v=vs.80).aspx )指令。

答案 1 :(得分:1)

这是我想出的。与上述非常相似:

functions macro fnames:VARARG
local list
list textequ <>
for fname, <fnames>
    list catstr list, <,fname&_ptr: qword>
endm
list substr list, 2
exitm list
endm

extern stdin:qword, functions(puts, fgets, printf, srand, rand)

有效!因此,人们确实可以从内部指令调用宏函数。它们必须是宏功能,而不是宏程序。