在 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)
有效!所以确实可以从内部指令调用宏函数。它们必须是宏函数,而不是宏过程。
我有麻烦了。 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)
有效!所以确实可以从内部指令调用宏函数。它们必须是宏函数,而不是宏过程。