Předávání parametrů
První čtyři celočíselné argumenty jsou předány v registrech.Celočíselné hodnoty jsou předány (v pořadí zleva doprava) v RCX, RDX, R8 a R9.Argumenty 5 a vyšší jsou předány do zásobníku.Všechny argumenty jsou zarovnané na vpravo v registrech.To se provádí tak, aby volaný mohl ignorovat horní bity registru, pokud je to potřeba, a mohl získat přístup pouze k nezbytné části registru.
Argumenty s plovoucí desetinnou čárkou a dvojitou přesností, které jsou předány v XMM0 – XMM3 (až 4) s celočíselným slotem (RCX, RDX, R8 a R9), které by byly normálně použity pro základní slot, se neberou v úvahu (viz příklad) a naopak.
__m128typy, pole a řetězce nejsou nikdy předávány okamžitou hodnotou, ale spíše předán ukazatel do paměti přidělené volajícím.Struktury/sdružení o velikosti 8, 16, 32 nebo 64 bitů a __m64 budou předány, jako by šlo o celých čísel stejné velikosti.Struktury/sdružení jiných než těchto velikostí jsou předány jako ukazatel do paměti přidělené volajícím.Pro tyto typy agragace, předáváné jako ukazatel (včetně __m128), bude dočasná paměť, přidělená volajícím, zarovnána 16-ti bajty.
Vnitřní funkce, které alokují prostor v zásobníku a nevyžadují další funkce, mohou použít závislé registry k předání doplňkových argumentů registru, protože existuje těsná vazba mezi kompilátorem a implementací vnitřní funkce.Toto je další příležitost pro zlepšení výkonu.
Volaný má odpovědnost dumpingu parametrů registru do prostoru jejich stínu podle potřeby.
Následující tabulka shrnuje, jak jsou předávány parametry:
Typ parametru |
Jak předávat |
---|---|
Číslo s plovoucí desetinnou čárkou |
První 4 parametry – XMM0 přes XMM3.Ostatní předány na zásibník. |
Integer |
První 4 parametry – RCX, RDX, R8, R9.Ostatní předány na zásibník. |
Agregace (8, 16, 32 nebo 64bitů) a __m64 |
První 4 parametry – RCX, RDX, R8, R9.Ostatní předány na zásibník. |
Agregace (Jiná) |
Pomocí ukazatele.První 4 parametry předány jako ukazatel v RCX, RDX, R8 a R9 |
__m128 |
Pomocí ukazatele.První 4 parametry předány jako ukazatel v RCX, RDX, R8 a R9 |
Příklad argumentu předávání 1 – všechny integry
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
Příklad argumentu předávání 2 – všechny floaty
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
Příklad argumentu předávání 3 – smíšené inty a floaty
func3(int a, double b, int c, float d);
// a in RCX, b in XMM1, c in R8, d in XMM3
Příklad argument předávání 4 –__m64, __m128 a agregace
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