Sdílet prostřednictvím


Používání a zachování registrů ve vloženém sestavení

Specifické pro Microsoft

Obecně by neměla předpokládat rejstříku že daná hodnota při __asm blok začíná.Hodnoty registru nemusí být zachovány v samostatné __asm bloky.Ukončit blok vloženého kódu a vytvoříte další, nemůžete spoléhat na registračních pokladnách v druhém bloku zachovat jejich hodnoty z prvního bloku.__asm Blok dědí ať zaregistrovat hodnoty vyplývají z normálního toku řízení.

Použijete-li __fastcall konvence volání, kompilátor předává argumenty funkce v registrech místo v zásobníku.To můžete vytvořit problémy ve funkcích s __asm blokuje, protože žádný způsob, jak zjistit, který parametr v registru, které má funkce.Pokud funkce se stane přijímat parametr v EAX a okamžitě ukládá něco jiného v EAX, dojde ke ztrátě původní parametr.Kromě toho musí zachovat žurnálu ECX v jakékoli funkce deklarována s __fastcall.

Těmto konfliktům rejstříku, nepoužívejte __fastcall úmluvy pro funkce, které obsahují __asm blok.Zadáte-li __fastcall úmluvy globálně s možností kompilátoru /Gr deklarovat všechny funkce obsahující __asm se __cdecl nebo __stdcall. ( __cdecl Atribut instruuje kompilátor, aby pomocí konvence volání jazyka C funkce.) Pokud nejsou kompilace s /Gr, vyhnout se deklarování funkce, která se __fastcall atribut.

Při použití __asm k zápisu jazyka symbolických funkcí C/C++, nepotřebujete zachovat registrech EAX, EBX, ECX, EDX, ESI nebo EDI.Například v POWER2.Příklad C v Zápisu funkce vložené sestavení, power2 funkce není zachovat hodnotu v registru EAX.Však pomocí těchto registrů ovlivní kvalitu kódu protože alokace registru nelze použít k uložení hodnot mezi __asm bloky.Kromě toho pomocí EBX, ESI nebo EDI v kódu sestavení vložené vynutit kompilátoru, aby uložit a obnovit tyto registry v funkce prologu a epilogu.

Mělo zachovat ostatní registry, které používáte (například DS, SS, SP, BP a příznaky Registry) pro obor __asm blok.ESP a EBP Registry by měly zachovat, pokud nemáte z nějakého důvodu je změnit (zásobníky, například přepnutí).Viz také Optimalizace vložené sestavení.

Některé typy SSE vyžadují zarovnání zásobníku osm bajtů, vynucení kompilátor generuje kód dynamických zarovnání zásobníku.Abyste mohli získat přístup k místní proměnné a parametry funkce po zarovnání, kompilátor udržuje dva odkazy v rámečku. Pokud kompilátor provádí opomenutí ukazatel rámce (FPO), použije EBP a ESP. Pokud kompilátor neprovede FPO, použije EBX a EBP.Aby správně kód běží, neupravujte EBX v asm kódu Pokud funkce vyžaduje dynamické zásobníku zarovnání se může měnit rámcový ukazatel.Přesuňte zarovnaný typy osm bajtů z funkce nebo nepoužívejte EBX.

[!POZNÁMKA]

Pokud v kódu sestavení vložené změní směr příznak pomocí pokynů STD nebo CLD, je třeba obnovit příznak na původní hodnotu.

Specificka produktu Microsoft END

Viz také

Referenční dokumentace

Vložený assembler