2013-02-24 15 views
7

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?

cevap

10

Sorun şu ki x64 hedefleri için derliyorsunuz. genişletilmiş kayıt kümesi verildiğinde MSDN

itibaren x64 sadece kongre ve RISC tabanlı kural dışı durum işleme modeli çağıran __fastcall kullanır. __fastcall modeli, ilk dört bağımsız değişken için kayıtlar ve diğer parametreleri geçmek için yığın çerçevesini kullanır.

x86 hedefleri için derlemeye geçiş yapınız ve çeşitli çağrı kurallarını görebilmeniz gerekir.

+3

", 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 –

+0

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

+0

Başar, x86 çalışmasına geçtim. Çok teşekkürler! – Aaron

3

Bildiğim kadarıyla x64 yalnızca __fastcall kuralını kullanır. __cdecl ve stdcall sadece __fastcall olarak derlenecek. (Microsoft veya Microsoft dışı araçlarını kullanarak olsun) Windows bağlamında x64 mimarisi için derlerken

İlgili konular