Sdílet prostřednictvím


Přehled x64 konvencí volání

Dvě důležité změny z x86 na x64 jsou 64bitové schopnosti adresování a plochá sada 16 64bitových registrů pro obecné použití. Daná sada rozšířeného registru x64 používá konvenci volání __fastcall a RISC model zpracování výjimek. Model __fastcall používá registry pro první čtyři argumenty a blok zásobníku pro předání dalších parametrů.

Následující možnost kompilátoru vám pomůže optimalizovat Vaši aplikaci na x64:

Konvence volání

Binární rozhraní x64 aplikace (ABI) je konvence volání rychlého volání 4 registrů se zálohováním zásobníku pro tyto registry. Mezi argumenty funkce a registry pro tyto argumenty je přísná jednoznačná korespondence. Jakékoli argument, který se nevejde do 8 bajtů, nebo není 1, 2, 4 nebo 8 bajtový, musí být předán odkazem. Neexistuje žádná možnost rozložení jednoho argumentu přes více registrů. x87 zásobník registru je nepoužívaný. Může být použit, ale musí být závisle považován za volání napříč funkcí. Všechny operace s číslem s plovoucí desetinnou čárkou jsou prováděny pomocí 16 XMM registrů. Argumenty jsou předány v registrech, RCX, RDX, R8 a R9. Pokud jsou argumenty typu float/double, pak jsou předávány v XMM0L, XMM1L, XMM2L a XMM3L. 16bajtové argumenty jsou předávané odkazem. Předávání parametru je podrobně popsáno v tématu Předávání parametru. Kromě těchto registrů jsou registry RAX R10, R11, XMM4 a XMM5 závislé. Všechny ostatní registry jsou nezávislé. Využití registrů je podrobně popsáno v tématechVyužití registrů a Volající/volaný uložené registry.

Volající je zodpovědný za přidělování prostoru pro parametry volaného a musí vždy přidělit dostatek prostoru pro 4 parametry registru, a to i v případě, že volaný nemá tolik parametrů. Toto je výhodné v jednoduché podpoře neprototypových funkcí jazyka C a vararg funkcí C/C++. Pro vararg nebo neprototypové funkce musí být všechny hodnoty plovoucí desetinné čárky duplicitní v odpovídajících obecných případech registru. Všechny parametry nad prvními 4 musí být před voláním uloženy na zásobníku nad záložním úložištěm pro první 4 parametry. Podrobnosti o vararg funkcích lze nalézt v tématu Varargs. Informace o neprototypových funkcích jsou popsány v tématu Neprototypové funkce.

Zarovnání

Většina struktur je zarovnána k jejich přírozenému zarovnání. Primární výjimky jsou ukazatelem na zásobník a malloc nebo alloca paměť, které jsou zarovnány na 16bajtů, za účelem zlepšení výkonu. Zarovnání nad 16bajtů musí být provedeno ručně, ale 16bajtů je běžná velikost zarovnání pro XMM operace, což by mělo stačit pro většinu kódu. Další informace o struktuře rozložení a zarovnání, naleznete v tématu Typy a úložiště. Informace o rozvržení zásobníku naleznete v tématu Použití zásobníku.

Funkcionalita unwind

Všechny listové funkce [funkce, které ani nevolají funkci a ani si nepřidělují jakýkoliv prostor zásobníku] musí být opatřeny poznámkou s daty [jen xdata nebo ehdata, které jsou označeny z pdata], což správně popisuje operační systém jako operaci unwind, pro obnovu nezávislých registrů. Prology a epilogy jsou velmi omezené, takže mohou být správně popsány v xdata. Ukazatel na zásobník musí být zarovnáný na 16bajtů, s výjimkou listů funkcí, v jakékoli části kódu, který není součástí epilogu nebo prologu. Další informace o správné struktuře prologu a epilogu funkce naleznete v tématu Prolog a epilog. Další informace o zpracování výjimek a zpracování/unwind výjimek pdata a xdata, naleznete v tématu Zpracovávání výjimek (x64).

Viz také

Odkaz

Úmluvy softwaru x64