__cdecl, __stdcall и __fastcall все называются одинаково?

Я использую Visual C ++ 2010 и MASM в качестве моего x64-Ассемблера.
Это мой код C ++:

// 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;
}

И мой код сборки:

; 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

Причина, по которой я это делаю, состоит в том, чтобы я мог изучить различные соглашения о вызовах.
Я бы сделал соглашение о вызовах sum stdcall и изменил бы код asm так, чтобы он называл sum способом stdcall. Как только я это заработал, я бы сделал это, скажем, fastcall, а затем назвал это как «fastcall».

Но посмотрите на мой код сборки прямо сейчас. Когда я использую этот код, независимо от того, является ли sum stdcall, fastcall или cdecl, он будет компилироваться, выполняться нормально и печатать 25 как мою сумму.

Мой вопрос: как и почему все __cdecl, __stdcall и __fastcall могут быть названы одинаково?

7

Решение

Проблема в том, что вы компилируете для целей x64. От MSDN

Учитывая расширенный набор регистров, x64 просто использует вызов __fastcall
соглашение и основанная на RISC модель обработки исключений. __Fastcall
Модель использует регистры для первых четырех аргументов и фрейма стека.
передать другие параметры.

Переключитесь на компиляцию для целей x86, и вы сможете увидеть различные соглашения о вызовах в действии.

11

Другие решения

Насколько я знаю, x64 использует только соглашение __fastcall. __cdecl и stdcall будут просто скомпилированы как __fastcall.

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector