Udostępnij za pośrednictwem


Przegląd konwencji wywołania x64

Dwa ważne modyfikacje z x 86 do x64 są możliwości adresowania 64-bitowych, a płaski zestaw 16 64-bitowych rejestruje się do ogólnego użytku.Biorąc pod uwagę rozszerzony zarejestrować zestawu, x64 po prostu używa __fastcall wywołanie Konwencji i model obsługi wyjątków opartych na standardzie RISC.__fastcall Model używa rejestry, pierwsze cztery argumenty i ramek stosu do przekazania inne parametry.

Następująca opcja kompilatora pomaga zoptymalizować ubiegania się o x64:

Konwencji wywoływania

x64 Binarne interfejsu aplikacji (ABI) jest 4 zarejestrować konwencja wywołania fast-call, stos wsparcie dla takich rejestrów.Istnieje ścisłe odpowiedniość między argumentów w funkcjach i rejestry dla tych argumentów.Którykolwiek z argumentów, który nie mieści się w 8 bajtów, lub nie jest 1, 2, 4 lub 8 bajtów, muszą być przekazywane przez odwołanie.Nie są próby do rozpowszechniania pojedynczy argument większej liczbie kas.Stos rejestru 87 x jest nieużywany.Mogą być używane, ale muszą być uznane za lotnych całej wywołań funkcji.Wszystkich liczb zmiennoprzecinkowych operacje są wykonywane przy użyciu 16 rejestruje XMM.Argumenty są przekazywane w rejestrach, RCX, RDX, R8 i R9.Jeśli argumenty są float/podwójny, są one przekazywane w XMM0L, XMM1L, XMM2L i XMM3L.16-bajtowy argumenty są przekazywane przez odwołanie.Przekazywanie parametrów jest opisane szczegółowo w Przekazywanie parametru.Oprócz tych rejestrów RAX, R10, R11, XMM4 i XMM5 są niestabilne.Wszystkie inne rejestry są trwałą.Sposób użycia rejestru jest szczegółowo opisane w Użycie metody Register i Zapisane rejestrowania wywołującego/wywoływanego.

Obiekt wywołujący jest odpowiedzialny za przydzielanie miejsca dla parametrów, aby wywoływany i zawsze musi przydzielić wystarczającej ilości miejsca dla parametrów rejestru 4, nawet jeśli wywoływany nie ma tak wielu parametrów.Jest on przydatny prostota pomocnicze funkcje unprototyped C i funkcji C/C++ vararg.Do funkcji vararg lub unprototyped wszelkie wartości Pływak musi zostać skopiowane w odpowiednim rejestrze ogólnego przeznaczenia.Wszystkie parametry powyżej 4 pierwsze muszą być przechowywane na stosie, powyżej magazynu dla pierwszego 4, przed rozpoczęciem połączenia.Szczegóły funkcji Vararg znajdują się w Elementy vararg.Informacje o funkcji Unprototyped jest określony szczegółowo w Funkcje bez pierwowzoru.

Wyrównanie

Większość struktur są dostosowane do ich naturalnego wyrównanie.Podstawowy wyjątkami są wskaźnik stosu i pamięci malloc lub dystrybucji, które są dostosowane do 16-bajtowy, w celu zapewnienia lepszego wydajności.Wyrównanie powyżej 16 bajtów, które powinny być wykonywane ręcznie, ale ponieważ 16 bajtów jest typowy rozmiar wyrównania dla operacji XMM, to powinno to wystarczyć większość kodu.Aby uzyskać więcej informacji na temat struktury układu i wyrównanie zobacz Typy i magazynowania.Aby uzyskać informacje na temat układu stosu, zobacz Wykorzystanie stosu.

Unwindability

Wszystkie funkcje liścia [funkcje, które wywoływana jest funkcja, ani same przydzielić dowolnego miejsca na stosie] musi być odnotowany z danych [dalej danych dodatkowych lub ehdata, który jest wskazywany z pdata], który opisuje systemowi operacyjnemu jak prawidłowo rozwijać je, aby odzyskać trwałą rejestrów.Prologs i epilogs są bardzo ograniczone, tak aby mogły być odpowiednio opisane w danych dodatkowych.Wskaźnik stosu muszą być dostosowane do 16 bajtów, z wyjątkiem funkcje typu liść, a w każdym regionie kod, który nie jest częścią epilog lub prologu.Szczegółowe informacje o odpowiedniej strukturze funkcja prologu i epilogs Prolog i epilog.Aby uzyskać więcej informacji na temat obsługi wyjątków i pdata odwracanie/obsługi wyjątków i danych dodatkowych zobacz Obsługa wyjątków (x64).

Zobacz też

Informacje

Konwencje kodowania x64