Aracılığıyla paylaş


Önsöz/Epilog kod yazarken dikkat edilmesi gereken noktalar

Microsoft özel

Kendi önsöz ve epilog kod dizileri yazmadan önce yığın çerçevesi nasıl düzenlendiği anlamak önemlidir.Nasıl kullanılacağını bilmek yararlıdır __LOCAL_SIZE simgesi.

Yığın çerçevesini düzeni

Bu örnek, bir 32-bit işlevinde görünebilir standart önsöz kodunu gösterir:

push        ebp                ; Save ebp
mov         ebp, esp           ; Set stack frame pointer
sub         esp, localbytes    ; Allocate space for locals
push        <registers>        ; Save registers

localbytes Değişkeni temsil yığında yerel değişkenler için gerekli olan bayt sayısı ve <registers> değişkeni yığında kaydedilecek kayıtları listesini gösteren bir yer tutucudur.Kayıtları dağıtmaya sonra yığın üzerinde diğer uygun verileri yerleştirebilirsiniz.Karşılık gelen epilog kod aşağıdadır:

pop         <registers>   ; Restore registers
mov         esp, ebp      ; Restore stack pointer
pop         ebp           ; Restore ebp
ret                       ; Return from function

Yığın her zaman aşağı (karşı yüksek bellek adresleri) büyür.Temel işaretçi (ebp) basılan değerine işaret ebp.Locals alanı başlar ebp-4.Yerel değişkenlere erişmek için bir uzaklığı hesaplamak ebp uygun değeri çıkarılarak tarafından ebp.

__LOCAL_SIZE

Derleyici bir sembol sağlar __LOCAL_SIZE, satır içi assembler kod bloğu, işlev önsöz kullanmak için.Bu simge, yerel değişkenler özel önsöz kod yığını çerçeve alanı ayırmak için kullanılır.

Derleyici değerini belirler __LOCAL_SIZE.Değeri tüm kullanıcı tanımlı yerel değişkenleri ve derleyici tarafından oluşturulan geçici değişkenleri bayt sayısıdır.__LOCAL_SIZE sadece bir anlık işlenen; kullanılabilir bir ifade kullanılamaz.Değil, değiştirmek veya bu sembol değerini yeniden tanımlamak gerekir.Örne?in:

mov        eax, __LOCAL_SIZE           ;Immediate operand--Okay
mov        eax, [ebp - __LOCAL_SIZE]   ;Error

Aşağıdaki örnek içeren özel önsöz ve epilog çýplak işlevinin kullandığı sequences __LOCAL_SIZE önsöz sıradaki simgesi:

// the__local_size_symbol.cpp
// processor: x86
__declspec ( naked ) int main() {
   int i;
   int j;

   __asm {      /* prolog */
      push   ebp
      mov      ebp, esp
      sub      esp, __LOCAL_SIZE
      }
      
   /* Function body */
   __asm {   /* epilog */
      mov      esp, ebp
      pop      ebp
      ret
      }
}

Ayrıca bkz.

Başvuru

Çýplak işlev çağrıları