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

Posted

技术标签:

【中文标题】如何从 masm 引用外部 C++ 函数?【英文标题】:how do I reference an external C++ function from masm? 【发布时间】:2019-04-29 15:42:53 【问题描述】:

我目前正在学习 masm,但在调用外部函数时遇到问题。

我在 C++ 中有一个名为 writei 的函数,它接收一个 uint64 并输出它。

int writei(uint64_t a)

    cout << a;
    return 1;

我尝试“extrn”并从 .asm 文件中调用它,但编译器抛出“在函数 mai 中引用的未解析的外部符号 writei”。

这是 masm 代码(我使用的是 Visual Studio 2019)

extern writei : proto


.code
mai proc
    push rbp
    push rsp
    mov ecx,3
    call writei
    pop rsp
    pop rbp
    ret
mai endp
end

【问题讨论】:

您可能需要阅读 C++ 名称修饰。 @GideonMax - Jesper Juhl 是正确的:您需要在 C++ 端使用“extern C”处理“名称修改”。这确保了 C++ 目标文件具有与 C 兼容的外部名称(或等效地与 asm)。当然,您*也 在您的汇编源代码中也需要适当的“外部”定义。有关详细信息,请参阅下面的链接。 您通过接受答案表明问题已得到回答/解决。 【参考方案1】:

除此之外,您需要在 C++ 方法声明中使用 "extern C"。

例如:

extern "C" 
  int writei(uint64_t a);


int writei(uint64_t a)

    cout << a;
    return 1;

这是一篇很好的文章,更详细地解释了这一点:

ISO C++ FAQ: How to mix C and C++

【讨论】:

解决了这个问题,我习惯只是在名称前加上“public”(C#)。

以上是关于如何从 masm 引用外部 C++ 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的类文件运行函数?

为 C++ 程序编写 MASM 函数

如何从外部函数 C++ 访问动态结构?

在 MASM 中调用标准库函数

C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号

如何从嵌套组件发出,同时保持引用函数外部变量的能力