在 MASM 中调用宏

invoking macros in MASM

我有麻烦了。 MASM 宏的行为似乎根本不像 C 宏。 C 有一个预处理器,可以将文本作为标记序列处理,您可以在任何地方调用宏。在 MASM 中似乎并非如此。我找不到合适的文档,但你不能在指令中调用宏,对吗?除非它是另一个宏调用中的 pars 的一部分?或者当它出现在宏定义中时?这些是唯一的例外吗? 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 宏内部不允许 => 语法错误。

我到底能做什么?如果每行以逗号结尾,则可以将指令拆分为多行,对吧?但是,如果它无论如何都不解释宏调用,那么它就没有任何帮助。

我发现我可以做到:

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 为例。我不能对同一个过程多次使用过程 header。

有没有解决这个难题的聪明办法?是否可以使用 MASM 宏来生成单行输出?我不知道怎么办。赶快去营救吧,你们这些书呆子! :) 谢里欧

EXTERN directive的签名是

EXTERN [[    language-type]] name [[ (altid) ]] : type
       [[, [[language-type]] name [[ (altid) ]] : type ...]]

因此您可以像这样使用 CATSTR directive 创建一个 one-liner:

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 directive.

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

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)

有效!所以确实可以从内部指令调用宏函数。它们必须是宏函数,而不是宏过程。