Visual C++ 2010 ve MASM benim x64-Assembler kullanıyorum.__cdecl, __stdcall ve __fastcall hepsi aynı şekilde denir?
// 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;
}
Ve montaj kodu:
Bu benim C++ kodu
; 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
Ben bu yüzden farklı arama kuralları öğrenebilir bu yaptığını nedeni. Toplamın çağrı çağrısını stdcall yapar ve asm kodunu değiştiririm, böylece "stdcall" yolunu toplar. Çalışmaya başladığımda, "hızlı çağrı" diyerek, "fastcall" olarak adlandırıyorum.
Ancak derleme koduma hemen bakın. Bu kodu kullandığımda, toplamı stdcall, fastcall veya cdecl olursa olsun, derleme yapar, iyi çalışır ve toplamı 25 olarak basar.
Benim sorum: Nasıl ve neden __cdecl, __stdcall ve __fastcall tüm aynen böyle çağrılabilir?
", yalnızca bir çağrı kuralı var - burada açıklanan bir o stdcall böylece, thiscall, cdecl, fastcall vb şimdi hepsi bir ve aynı. " http://en.wikipedia.org/wiki/X86_calling_conventions –
Tamam ... Sadece x86'ya geçeceğim ve farklı çağrı kuralları ile derlemeye ve sonuçların ne olduğunu görmeye çalışacağım. yapıyor. Muhtemelen işe yaradığında, cevabını kabul edeceğim :) – Aaron
Başar, x86 çalışmasına geçtim. Çok teşekkürler! – Aaron