Sdílet prostřednictvím


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

Viz také

Odkaz

Konvence volání