Aracılığıyla paylaş


Satır içi derleme sayaçlarda koruma ve kullanma

Microsoft özel

Genel olarak, size bir kayıt belirli bir değeri olduğunu varsayımında bulunmamalıdır, bir __asm blok başlar.Kayıt değerleri ayrı saklanması için garanti __asm engeller.Satır içi kod bloğunu bitirip diğerine başlamak, kayıtları ikinci bloktaki ilk blok kendi değerleri korumak için yeterli olmaz.Bir __asm blok miras ne olursa olsun normal akış denetiminin sonuç değerleri kaydetmek.

Kullanırsanız, __fastcall çağırma, derleyici fonksiyon bağımsız değişkenleri yerine kayıtları, yığında geçirir.Bu sorunları işlevleriyle oluşturabilirsiniz __asm bir işlev hangi kayıttaki hangi parametresidir anlamanın bir yolu yoktur çünkü engeller.İşlev eax parametre alacak olur ve hemen eax başka bir şey depolar, özgün parametre kaybolur.Buna ek olarak, herhangi bir işlevi ile bildirilen ecx kayıttaki korumak __fastcall.

Bu tür kayıt çakışmaları önlemek için kullanmadığınız __fastcall kuralı içeren işlevleri için bir __asm blok.Belirtirseniz, __fastcall /Gr derleyici seçeneği ile genel kuralı bildirmek her işlevi içeren bir __asm ile engellemek __cdecl veya __stdcall.( __cdecl Özniteliği c çağırma kuralı için bu işlevi kullanmak için derleyici söyler.) /Gr ile derleme değil, işleviyle bildirmek kaçının __fastcall özniteliği.

Kullanırken __asm c/C++ işlevleri assembler dili yazmak için eax, ebx, ecx, edx, ESI veya EDI Yazmaçları korumak gerekmez.Örneğin, POWER2 içinde.C örnekte Yazma işlevleri satır içi derleme ile, power2 işlevi eax kayıttaki değeri korumak değildir.Kayıt ayırıcı bunları üzerinden değerlerini depolamak için kullanamazsınız çünkü ancak bu kayıtları kullanarak kod kalitesini etkiler __asm engeller.Buna ek olarak, satır içi assembly kodunda ebx, ESI veya EDI kullanarak, kaydetme ve geri yükleme işlevi prolog ve epilog içinde bu kayıtları için derleyici zorlayın.

Kapsamı için kullanın (ds, ss, sp, bp ve bayraklar kayıtları gibi) diğer kayıtları korumak __asm blok.Bunları (yığınları, örneğin geçmek için) değiştirmek için herhangi bir nedenle yoksa esp ve ebp Yazmaçları korumak.Ayrıca bkz: En iyi duruma getirme satır içi derleme.

Bazı sse türleri sekiz bayt yığın hizalamayı dinamik yığın hizalama kod yayma derleyici zorlama gerektirir.Yerel değişkenler hem işlev parametreleri sonra hizalama erişebilmeleri için derleyici iki çerçeve işaretçiler tutar.Kare işaretçisi atlandığını (fpo) derleyici gerçekleştirir, ebp ve esp kullanır.Derleyici fpo yapmıyorsa, ebx ve ebp kullanacaktır.Kare işaretçisiyle değiştirebilir gibi işlev dinamik yığın hizalama gerektiriyorsa kod çalışır doğru emin olmak için ebx asm kodda değişiklik yapmayın.Sekiz bayt hizalanmış türleri işlevin dışına taşımak ya da ebx kullanmaktan kaçının.

[!NOT]

Satır içi derleme kodunuzu std veya cld yönergeleri kullanarak yön bayrağı değişirse, bayrak özgün değerine geri yüklemeniz gerekir.

SON Microsoft özel

Ayrıca bkz.

Başvuru

Satır içi Assembler