Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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-4
baş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_SIZE
iş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. Örneğin:
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ü