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 __fastcall
bildirilen 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 __stdcall
ile __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ü