Předávání parametru
První čtyři celočíselné argumenty budou předány v registrech. Celočíselné hodnoty budou předány (v pořadí zleva doprava) v RCX, RDX, R8 a R9. Čtyři a více argumentů bude předáno do zásobníku. Všechny argumenty jsou zarovnané 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.
Typy __m128, pole a řetězce nejsou nikdy předávány okamžitou hodnotou, ale spíše bude předán ukazatel do přidělené paměti volajícího. Struktury/sdružení o velikosti 8, 16, 32 nebo 64bitů a __m64 budou předány, jako kdyby byly celé čísla ve stejné velikosti. Struktury/sdružení jiných než těchto velikostí, budou 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