我在.asm文件中有一些x86代码,正在尝试从C++:中使用它
C++
#include <iostream>
extern "C" int addInts(int a, int b);
int main() {
int a = 1;
int b = 2;
int result = addInts(a, b);
std::cout << "Result :t" << result << std::endl;
return 0;
}
Asm
.386
.MODEL FLAT, C
.CODE
addInts PROC
PUSH EBP
MOV EBP, ESP
MOV EAX, [EBP+8]
MOV ECX, [EBP+12]
ADD EAX, ECX
POP EBP
RET
addInts ENDP
END
尝试运行此操作将导致:
多次指定LNK4042(警告(对象,忽略额外的(asm对象文件(
LNK2019(错误(函数_main(asm对象文件(中引用的未解析外部符号_addInts
随后,由于未解决的外部(解决方案可执行(,以致命错误LNK1120的形式进行了最后的反抗行为
我正在将Visual Studio 2019与MSVC v142和MASM一起使用。我的另一个自包含的汇编代码没有任何问题,我编写的另一项涉及从C++读取x86中的int数组的函数运行良好。我真的看不出这里出了什么问题,如果是我的代码有问题,或者是一些深奥的设置,或者完全是其他什么问题。
如果我将Asm代码的最后一行更改为END addInts
,那么程序只运行并立即退出,std::cout
中没有任何内容。
解决方案文件在链接器设置中没有定义入口点,这就是我在C++中调用asm的最后一段代码中所做的。
asm文件包含在使用Microsoft宏汇编程序的生成中。
cpp文件被设置为编译为C++,以防万一。
注意到.cpp
文件和.asm
文件具有相同的名称(IntegerAddition.cpp
和IntegerAddition.asm
(后,此问题得到了解决。
将程序集文件重命名为其他文件解决了此问题。