__cdecl, __stdcall und __fastcall heißen alle genauso?

Ich verwende Visual C ++ 2010 und MASM als meinen x64-Assembler.
Das ist mein 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;
}

Und mein Assembler-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

Der Grund, warum ich das tue, ist, dass ich die verschiedenen Anrufkonventionen lernen kann. Ich würde sum's Aufrufkonvention stdcall machen und den asm-Code so ändern, dass er sum the "stdcall" -Methode aufruft. Sobald ich das zum Laufen gebracht habe, würde ich es zum Beispiel fastcall machen und es dann asm "fastcall" nennen.

Aber sehen Sie sich jetzt meinen Assembler-Code an. Wenn ich diesen Code verwende, wird er kompiliert, ausgeführt und 25 als meine Summe ausgegeben, unabhängig davon, ob es sich um stdcall, fastcall oder cdecl handelt.

Meine Frage: Wie und warum können __cdecl, __stdcall und __fastcall alle auf die gleiche Weise aufgerufen werden?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage