我遇到了麻烦。 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
答案 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
,参数或表达式的输入,您可以使用EXITM
(https://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)
有效!因此,人们确实可以从内部指令调用宏函数。它们必须是宏功能,而不是宏程序。