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