Sdílet prostřednictvím


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

Viz také

Referenční dokumentace

Konvence volání