【发布时间】:2020-10-07 12:05:28
【问题描述】:
这里是汇编代码:
.386
.model flat, stdcall
_asmFunc proto arg1: dword, arg2: dword
.data
.code
_asmFunc proc, arg1: dword, arg2:dword
mov eax, arg1
add eax, arg2
ret
_asmFunc endp
end
这里是 c++ 代码:
#include <iostream>
extern "C" int asmFunc(int, int);
int main()
{
std::cout << asmFunc(5, 6);
char a;
std::cin >> a;
return 0;
}
问题是:如果我从函数中删除所有参数,请从 asm 中的模型中删除 stdcall 并删除 proto 行 - 我可以从 c++ 中调用它,但如果我想传递一些参数,我需要在程序之后添加它们标头,这意味着我需要添加stdcall,在这种情况下,c ++告诉我程序找不到我的函数(未解析的外部符号_asmFunc),我真的找不到任何正常的组合(因为我不想通过参数传递通过寄存器手动或手动将它们放入堆栈并在我的函数中取出它们,太多额外代码)允许我使用来自 c++ 的参数调用 asm 函数,要么它不能有参数,要么 c++ 代码找不到它
【问题讨论】:
-
您的 C++ 和汇编代码需要就调用约定达成一致。在你的汇编代码中使用
.model flat, c,或者在你的C++代码的函数声明中添加__attribute__((__stdcall__))。 -
我的错,忘了提,我都试过了,在添加模型平面的情况下,c而不是模型平面,stdcall没有改变,c++仍然找不到函数(在c++代码中试过添加 __cdecl、__stdcall 和什么都没有,这些都没有帮助),就模型平面而言,stdcall 也尝试将所有三种变体添加到 c++ 代码中 - 没有帮助,只有在 asm 和 c++ 代码都有模型平面、stdcall 和__stdcall - 错误消息中的函数名称变为 _asmFunc@8 而不仅仅是 _asmFunc,也没有设法修复此错误
-
您不应自己在名称中添加下划线。 MASM 为您做到这一点。
-
谢谢,不知道这个细节,你真棒