Felhasználásának és megőrzésének a beépített nyilvántartásban szerelés

Általában az elején __asm ​​blokk nem kell azt feltételezni, hogy a nyilvántartás lesz különösebb jelentősége. Mentsd értékeket mutatnak a különböző blokkok __asm ​​nem garantált. Amikor egy blokk végződik beágyazott kódot, és elkezdődik a következő mondat nem lehet azt feltételezni, hogy a nyilvántartások a második blokk megtartják értéküket az első blokk. __asm ​​egység örökli a regiszter kapott értékek a hagyományos eljárásban ellenőrzési flow.

Ha a __fastcall hívási konvenció. fordítóprogram halad függvényargumentumok regiszterekben helyett verem. Ez problémákat okozhat a funkció blokkok __asm. mert a funkció nincs mód annak megállapítására, hogy milyen paraméterek vannak elrendezve nyilvántartásokban. Ha a függvény paraméter kapott EAX regiszterben, és azonnal rögzítésre kerül nyilvántartásba EAX más értéket, az eredeti paraméter elveszett. Továbbá szükség van, hogy fenntartsák ECX regiszter értéke minden funkció deklarált attribútum __fastcall.

Annak elkerülése érdekében, ezeket a konfliktusokat, nyilvántartások, ne használja a __fastcall egyezmény funkciókat tartalmazó blokk __asm. Ha a megállapodás __fastcall meghatározott globálisan egy fordító / Gr paraméter nyilvánítja minden funkció blokk __asm. attribútum __cdecl vagy __stdcall. (__cdecl attribútum utasítja a fordítót használni ezt a funkciót hívó egyezmények nyelvi C.) összeállítása során a / Gr nem történik meg, nem hogy függvényeket az attribútum __fastcall.

Ha __asm ​​blokk kódot írni assembly nyelven C / C ++ függvények, nincs szükség, hogy megőrizzék az értékek EAX, EBX, ECX, EDX, ESI és EDI. Például a példában szakasz POWER2.C írás funkciók a beágyazott kódot assembly nyelven funkció Power2 nem őrzi értékét az EAX regiszterben. Azonban az e nyilvántartások minőségét befolyásolja a kódot, mert a nyilvántartás lefoglaló nem használhatja értékek tárolására blokkok közötti __asm. Ezen felül, ha a beágyazott kódot assembly nyelven használja regisztrációhoz EBX, ESI és EDI, hogy a fordító menteni és visszaállítani az értékeket az e nyilvántartások a prológus és epilógus funkciót.

Meg kell tárolni értékeinek regiszterek használják mások (például, DS, SS, SP, BP és zászló regiszterek) belül egységnyi területen __asm. Szükséges értékeket tárolnak ESP és EBP regiszter, hacsak nincs valami különleges oka, hogy megváltoztassa őket (kapcsolási köteget, például). Lásd. Szintén a szakasz optimalizálása a beágyazott kódot assembly nyelven.

Bizonyos típusú SSE igényel 8 bájtos összehangolása a verem, így a fordítóprogram generálni kódot dinamikusan igazítsa a köteget. Ahhoz, hogy hozzá tudjon férni a lokális változók és függvények paraméterei a beállítás után, a fordító támogatja a két mutató képkockákat. Ha a fordító végzi csökkentené a keret mutatót (FPO), akkor használja a EBP és ESP regiszterek. Ha a fordító nem végez FPO, akkor használja a nyilvántartások EBX és EBP. A helyes végrehajtását a kódot, ne változtassa meg az értéket a nyilvántartásban EBX kód assembly nyelven, ha a funkció megköveteli dinamikus halom igazítás, mivel ez megváltoztathatja a keret mutatót. Mozgassa a fajta 8-bájtos igazítva kívül funkciót vagy használja a regiszter EBX.

Ha a beágyazott kódot assembly nyelven megváltoztatja az irányt a jelzőt az STD utasítást vagy CLD, akkor vissza kell állítani az eredeti értékének ez a zászló.

Kapcsolódó cikkek