装配发送参数 - fastcall

时间:2015-06-23 19:12:32

标签: c++ assembly

我正在尝试从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跳过==========

1 个答案:

答案 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);