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ı