__cdecl, __stdcall and __fastcall are all called the exact same way?

杀马特。学长 韩版系。学妹 提交于 2019-12-18 04:54:08

问题


I am using Visual C++ 2010, and MASM as my x64-Assembler.
This is my C++ code:

// include directive
#include "stdafx.h"
// functions
extern "C" int Asm();
extern "C" int (convention) sum(int x, int y) { return x + y; }
// main function
int main()
{
    // print asm
    printf("Asm returned %d.\n", Asm());
    // get char, return
    _getch();
    return EXIT_SUCCESS;
}

And my assembly code:

; external functions
extern sum : proc
; code segment
.code
Asm proc
    ; create shadow space
    sub rsp, 20o
    ; setup parameters
    mov ecx, 10
    mov edx, 15
    ; call
    call sum
    ; clean-up shadow space
    add rsp, 20o
    ; return
    ret
Asm endp
end

The reason I am doing this is so I can learn the different calling conventions. I would make sum's calling convention stdcall, and modify the asm code so it would call sum the "stdcall" way. Once I got that working, I would make it, say, fastcall, and then call it in asm the "fastcall" way.

But look at my assembly code right now. When I use that code, no matter if sum is stdcall, fastcall or cdecl, it will compile, execute fine, and print 25 as my sum.

My question: How, and why can __cdecl, __stdcall and __fastcall all be called the exact same way?


回答1:


The problem is that you're compiling for x64 targets. From MSDN

Given the expanded register set, x64 just uses the __fastcall calling convention and a RISC-based exception-handling model. The __fastcall model uses registers for the first four arguments and the stack frame to pass the other parameters.

Switch over to compiling for x86 targets, and you should be able to see the various calling conventions in action.




回答2:


As far as i know x64 only uses the __fastcall convention. __cdecl and stdcall will just be compiled as __fastcall.



来源:https://stackoverflow.com/questions/15047758/cdecl-stdcall-and-fastcall-are-all-called-the-exact-same-way

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!