我正在尝试从c ++调用我的asm函数,并根据维基百科发送两个应该保存在ecx和edx中的关于fastcall调用对话的参数。
但这不起作用。我错过了什么吗?
装配x86
.model flat
.code
_TestFunction proc
mov eax, ecx
add eax, edx
ret
_TestFunction endp
end
C ++代码
#include <iostream>
extern "C" int TestFunction(int a, int b);
int main()
{
std::cout << "Function returns:" << TestFunction(200,100) << std::endl;
std::cin.get();
return 0;
}
该函数返回1,这是寄存器:
ECX = 00000000 EDX = 00000001
构建日志:
1&gt; ------ Rebuild All started:Project:Tutorial,Configuration:Debug Win32 ------ 1&gt;
组装asm.asm ... 1&gt; Main.cpp 1&gt; Tutorial.vcxproj - &gt; C:\ Users \ nilo \ documents \ visual studio 2012 \项目\教程\调试\ Tutorial.exe==========重建全部:1成功,0失败,0跳过==========
答案 0 :(得分:2)
如果您真的想要Win32中的__fastcall calling convention,您的代码需要进行小的更改:
在程序集文件中,更改
_TestFunction proc
...
_TestFunction endp
到
@TestFunction@8 proc
...
@TestFunction@8 endp
在C ++文件中,更改
extern "C" int TestFunction(int a, int b);
到
extern "C" int __fastcall TestFunction(int a, int b);