在 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 中调用宏的主要内容,如果未能解决你的问题,请参考以下文章

在 MASM 中调用标准库函数

宏打印存储在字节中的值。组装masm

使用 MASM32 随机化装配中的数字

C#导入c++ dll报找不到dll文件 masm32调用c++类库

如何从 masm 引用外部 C++ 函数?

MASM32v11编程调用Process32First失败: 程序发出命令,但命令长度不正确