问题描述
这是汇编代码:
.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并删除原型行-我可以从c ++调用它,但是如果我想传递一些参数,则需要在过程后添加它们标头,这意味着我需要添加stdcall,在这种情况下,c ++告诉我程序找不到我的函数(未解析的外部符号_asmFunc),我真的找不到任何正常的组合(因为我不想通过传递参数通过寄存器或手动将它们放入堆栈,然后将其放入我的函数中(太多额外的代码),这使我可以使用c ++中的参数来调用asm函数,要么它没有参数,要么c ++代码找不到它
解决方法
-
.model
指令中的调用约定必须与C函数声明中的调用约定匹配。对于默认的cdecl
调用约定,只需使用.model flat,c
-
由于在
.model
指令中指定了语言类型,因此会自动执行名称修饰。这意味着您不应在名称中添加诸如_
之类的名称修饰,这些名称修饰将根据指定的调用约定按照name mangling rules修饰。
asm代码中的函数名称开头应不带_,因为asm会自动添加下划线