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-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. Ö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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin