在 MASM 中调用宏
Posted
技术标签:
【中文标题】在 MASM 中调用宏【英文标题】:invoking macros in MASM 【发布时间】:2017-01-20 22:31:55 【问题描述】:我有麻烦了。 MASM 宏似乎根本不像 C 宏。 C 有一个预处理器,它将文本作为标记序列处理,您可以在任何地方进行宏调用。在 MASM 中似乎并非如此。我无法为此找到合适的文档,但是您不能在指令中调用宏,对吗?除非它是另一个宏调用中的 pars 的一部分?或者当它出现在宏定义中时?只有这些例外吗?规范/文档在哪里?
好的,我要做的是:
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 为例。我不能多次将 proc 标头用于同一个 proc。
有解决这个困境的聪明办法吗?是否可以使用 MASM 宏来生成单行输出?我不知道怎么做。赶紧去救援,你们这些书呆子! :) Cheerioh
【问题讨论】:
我找到的一个很好的文档是this from Randall Hyde。有关 MASM 指令,请参阅第 8 章。 您阅读过文档吗? 投反对票的人太可怕了。 【参考方案1】:EXTERN
directive的签名是
EXTERN [[ language-type]] name [[ (altid) ]] : type
[[, [[language-type]] 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
directive。
【讨论】:
太棒了!这样就解决了。 :) 我进行了实验并想出了与您的非常相似的东西。见下文。【参考方案2】:这是我想出的。和上面的很相似:
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 中调用宏的主要内容,如果未能解决你的问题,请参考以下文章