Udostępnij za pośrednictwem


Przekazywanie parametru

Pierwsze cztery całkowitą argumenty są przekazywane w rejestrach.Liczby całkowite są przekazywane (w kolejności od lewej do prawej) w RCX, RDX, R8 i R9.Pięć argumentów i wyżej są przekazywane na stosie.Wszystkie argumenty są wyrównane do prawej w rejestrach.Ma to tak, aby wywoływany można zignorować górnym bitów rejestru, jeśli trzeba i można uzyskać dostęp tylko do części niezbędnych rejestru.

Zmiennoprzecinkowe i podwójnej precyzji argumenty są przekazywane w XMM0-XMM3 (do 4) z gniazdem liczby całkowitej (RCX, RDX, R8 i R9), który zwykle używane dla kardynalny gniazdo, w które są ignorowane (Zobacz przykład) i na odwrót.

__m128typy, tablice i ciągi nigdy nie są przekazywane przez wartość natychmiastowe, ale raczej wskaźnik jest przekazywana do pamięci przydzielonej przez obiekt wywołujący.Strukturach/związki __m64 i rozmiar 8, 16, 32 lub 64 bity są przekazywane tak, jakby były liczb całkowitych o tym samym rozmiarze.Strukturach/związki, inne niż te rozmiary są przekazywane jako wskaźnik do pamięci przydzielonej przez obiekt wywołujący.Dla tego typu agregacji, przekazane jako wskaźnik (w tym __m128) obiekt wywołujący pamięć przydzielona przez tymczasowy będzie wyrównany do 16-bajtowy.

Funkcje wewnętrzne, które nie przydzielić pamięci i nie wymagają innych funkcji można użyć innych rejestrów lotnych przekazywać argumenty dodatkowe rejestru, ponieważ jest mocno powiązanie między kompilator i wprowadzenia w życie funkcję wewnętrzną.Jest to dalszych możliwości dla poprawy wydajności.

Wywoływany jest odpowiedzialny za dumpingu parametrów rejestru na ich miejsce cienia, w razie potrzeby.

W poniższej tabeli podsumowano sposób przekazywania parametrów:

Typ parametru

Jak przekazanego

Liczba zmiennoprzecinkowa

Po pierwsze 4 parametry-XMM0 przez XMM3.Inne osoby przekazywana na stosie.

Liczba całkowita

Po pierwsze 4 parametry – SAMĄ RDX, R8 R9.Inne osoby przekazywana na stosie.

Funkcje agregacji (8, 16, 32 lub 64 bity) i __m64

Po pierwsze 4 parametry – SAMĄ RDX, R8 R9.Inne osoby przekazywana na stosie.

Agregaty, (inne)

Przez wskaźnik.Po pierwsze 4 parametry przekazywane jako wskaźniki w RCX, RDX, R8 i R9

__m128

Przez wskaźnik.Po pierwsze 4 parametry przekazywane jako wskaźniki w RCX, RDX, R8 i R9

Przykład argument przekazując 1 – wszystkie liczby całkowite

func1(int a, int b, int c, int d, int e);  
// a in RCX, b in RDX, c in R8, d in R9, e pushed on stack

Przykład argument podanie wartości 2 – wszystkich elementów pływających

func2(float a, double b, float c, double d, float e);  
// a in XMM0, b in XMM1, c in XMM2, d in XMM3, e pushed on stack

Przykład argument przekazując 3-spotykamy mieszanych i pływaków

func3(int a, double b, int c, float d);  
// a in RCX, b in XMM1, c in R8, d in XMM3

Przykład argument przekazując 4 –__m64, __m128 oraz agregatów

func4(__m64 a, _m128 b, struct c, float d);
// a in RCX, ptr to b in RDX, ptr to c in R8, d in XMM3

Zobacz też

Informacje

Konwencja wywoływania