Aracılığıyla paylaş


Giriş ve Bitiş Kodu Yazmada Dikkat Edilmesi Gerekenler

Microsoft'a Özgü

Kendi giriş ve kapsam kodu dizilerinizi yazmadan önce, yığın çerçevesinin nasıl yerleştirıldığını anlamak önemlidir. Sembolün nasıl kullanılacağını __LOCAL_SIZE bilmek de yararlıdır.

Yığın Çerçevesi Düzeni

Bu örnekte, 32 bit işlevinde görünebilecek standart giriş kodu gösterilmektedir:

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 yerel değişkenler için yığında gereken bayt sayısını gösterir, <registers> değişkeni ise yığında kaydedilecek yazmaçların listesini gösteren bir yer tutucudur. Yazmaçları gönderdikten sonra, yığın üzerine başka bir uygun veri yerleştirebilirsiniz. Aşağıda ilgili sonuç kodu bulunmaktadı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ğı doğru (yüksek bellek adreslerinden düşük olanlara) büyür. Taban işaretçisi (ebp) ebp'nin gönderilen değerine işaret eder. Yerel halk alanı adresinden ebp-4başlar. Yerel değişkenlere erişmek için uygun değeri ebp'den çıkararak ebp'den bir uzaklık hesaplayın.

__LOCAL_SIZE

Derleyici, __LOCAL_SIZEişlev prolog kodunun satır içi derleyici bloğunda kullanmak için bir simgesi sağlar. Bu simge, özel giriş kodunda yığın çerçevesindeki yerel değişkenler için alan ayırmak için kullanılır.

Derleyici değerini belirler __LOCAL_SIZE. Değeri, kullanıcı tanımlı tüm yerel değişkenlerin ve derleyici tarafından oluşturulan geçici değişkenlerin toplam bayt sayısıdır. __LOCAL_SIZE yalnızca anlık işlenen olarak kullanılabilir; bir ifadede kullanılamaz. Bu simgenin değerini değiştirmemeli veya yeniden tanımlamamalısınız. Örnek:

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

Özel giriş ve epilog dizilerini içeren çıplak işlevin aşağıdaki örneği, giriş dizisindeki simgeyi __LOCAL_SIZE kullanır:

// 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
      }
}

END Microsoft'a Özgü

Ayrıca bkz.

Naked İşlevi Çağrıları