Aracılığıyla paylaş


Bir Satır İçi Derlemede Kayıtları Kullanma ve Koruma

Microsoft'a Özgü

Genel olarak, bir blok başladığında bir yazmaç belirli bir değere __asm sahip olacağını varsaymamalısınız. Kayıt değerlerinin ayrı __asm bloklar arasında korunacağı garanti edilmemektedir. Satır içi kod bloğunu sona erdirip başka bir kod başlatırsanız, ilk bloktaki değerlerini korumak için ikinci bloktaki yazmaçlara güvenemezsiniz. Blok __asm , normal denetim akışından elde edilen kayıt değerlerini devralır.

Çağırma kuralını kullanırsanız __fastcall , derleyici işlev bağımsız değişkenlerini yığın yerine yazmaçlarda geçirir. Bu, bir işlevin hangi parametrenin hangi kayıtta olduğunu anlamanın bir yolu olmadığından bloklarla __asm işlevlerde sorun oluşturabilir. İşlev EAX'te bir parametre alıyorsa ve hemen başka bir şeyi EAX'te depolarsa, özgün parametre kaybolur. Ayrıca, ile __fastcallbildirilen herhangi bir işlevde ECX yazmaçını korumanız gerekir.

Bu tür kayıt çakışmalarını önlemek için, blok içeren __asm işlevler için kuralı kullanmayın__fastcall. Kuralı genel olarak /Gr derleyici seçeneğiyle belirtirseniz__fastcall, veya __stdcallile __cdecl bir __asm blok içeren her işlevi bildirin. (özniteliği, __cdecl derleyiciye bu işlev için C çağırma kuralını kullanmasını söyler.) /Gr ile derlenmiyorsanız işlevi özniteliğiyle __fastcall bildirmekten kaçının.

C/C++ işlevlerinde derleme dili yazmak için kullanırken __asm EAX, EBX, ECX, EDX, ESI veya EDI yazmaçlarını korumanız gerekmez. Örneğin, POWER2'de. Satır içi Derleme ile yazma İşlevleri'nde C örneği, power2 işlev EAX yazmaçtaki değeri korumaz. Ancak, bu yazmaçların kullanılması kod kalitesini etkiler çünkü kayıt ayırıcısı bloklar arasında __asm değerleri depolamak için bunları kullanamaz. Buna ek olarak, satır içi derleme kodunda EBX, ESI veya EDI kullanarak, derleyiciyi bu yazmaçları prolog ve epilog işlevinde kaydetmeye ve geri yüklemeye zorlarsınız.

Blok kapsamı __asm için kullandığınız diğer yazmaçları (DS, SS, SP, BP ve bayrak yazmaçları gibi) korumanız gerekir. ESP ve EBP yazmaçlarını değiştirmek için bir nedeniniz yoksa (örneğin, yığınları değiştirmek için) korumanız gerekir. Ayrıca bkz . Satır içi Derlemeyi İyi hale getirme.

Bazı SSE türleri sekiz baytlık yığın hizalaması gerektirir ve derleyiciyi dinamik yığın hizalama kodu yaymaya zorlar. Hizalamadan sonra hem yerel değişkenlere hem de işlev parametrelerine erişebilmek için derleyici iki çerçeve işaretçisi tutar. Derleyici çerçeve işaretçisi atlama (FPO) gerçekleştirirse EBP ve ESP kullanır. Derleyici FPO gerçekleştirmezse EBX ve EBP kullanır. Kodun doğru çalıştığından emin olmak için, işlev çerçeve işaretçisini değiştirebileceğinden dinamik yığın hizalaması gerektiriyorsa ASM kodunda EBX'i değiştirmeyin. Sekiz baytlık hizalanmış türleri işlev dışına taşıyın veya EBX kullanmaktan kaçının.

Not

Satır içi derleme kodunuz STD veya CLD yönergelerini kullanarak yön bayrağını değiştirirse, bayrağı özgün değerine geri yüklemeniz gerekir.

END Microsoft'a Özgü

Ayrıca bkz.

Satır İçi Assembler