如何将 ASM obj 文件与 C++ 程序集成?

Posted

技术标签:

【中文标题】如何将 ASM obj 文件与 C++ 程序集成?【英文标题】:How do I integrate an ASM obj file with a C++ program? 【发布时间】:2011-10-08 22:35:20 【问题描述】:

我想在 Visual Studio 2010 中集成 ASM 和 C++ 代码。基本上,我希望能够在我的 C++ 代码中使用在 ASM 中创建的某些例程。

所以我想知道:

    首先如何将 ASM obj 文件添加到 VS2010? 如何从代码的 C++ 部分调用 ASM 代码中的函数? 假设我创建了一个函数(在 ASM 中),它计算一个值并将该值存储在税务登记簿中。假设它被称为计算。我是否能够使用类似 int val=compute(); 的方式在 C++ 中接收返回值?

【问题讨论】:

【参考方案1】:

所有这些示例都有您需要的:

http://msdn.microsoft.com/en-us/library/t13a3526%28v=VS.80%29.aspx

您必须让 Visual Studio 自动将它们“转换”为新的项目格式,但我只是使用 PRIMESTEP2 示例进行了尝试,并且成功了。

您只需要一个函数原型,例如:

void sieve(void);  // prototype for Sieve of Eratosthenes function

然后您可以在 asm 中实现它们,它们将链接在一起。您可以通过将它们放在 EAX 寄存器中来返回值,它将作为 C / C++ 中的返回值。

【讨论】:

示例使用 C,而不是 C++。所以它们不能在 C++ 中工作。即使我只是将文件的格式从 .c 更改为 .cpp,我也收到了链接器错误(未解析的外部引用在 main 中) 您可能需要将原型制作为外部“C”。 我做到了。有效。但后来我尝试了我的一个文件,但它没有用。然后我意识到调用约定需要是c,而不是stdcall。现在它正在工作!【参考方案2】:

使用内联汇编不是更容易吗?

【讨论】:

我不知道,但如果可能的话,我想这样做。另外,请注意我使用了一些 MASM32 的宏和东西,我不知道这是否可以使用内联汇编程序。即使是这样,我也想知道如何做到这一点,因为我想让我的选择保持开放,而且我很好奇。 好吧,你可能不得不重写你的 asm 代码以使其符合 VS C++ 编译器约定,基本上你必须将返回值放入正确的寄存器中。 返回值存储在eax中,据我所知。不过我可能是错的。但是,是否可以使用 MASM 制作一个 obj 文件,然后将其链接到 Visual Studio 创建的 C++ obj 文件? 我猜 Project proporties -> Configuration proporties -> Linker -> Input -> Additional Dependencies 应该可以工作。

以上是关于如何将 ASM obj 文件与 C++ 程序集成?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle DB 管理ASM实例

如何将 x86 和 x64 asm 文件包含到单个 Visual Studio 项目中?

8086汇编 程序编译

如何将 VSCode 与 Visual C++ 编译器集成?

如何将 Tesseract OCR 库集成到 C++ 程序中

汇编代码调试程序debug参数说明