2011-12-02 19 views
16

Şu anda Intel işlemciler için montaj öğreniyorum. Yığın 'aşağı büyür' yana , nedenderleme esp ve ebp kayıtları

[ebp + 8] ;; This will access the first param 

Bence eski ebp değeri ve iade adresi atlamak zorunda konw belli bir elemanı erişmek için eklemek zorunda yapmak ve biz (8 kullanmak yüzden çünkü her biri 4 bayt uzunluğundadır). Bu biraz garip.

_start: 

;; what's ebp value here ? 

push eax 
push ebx 
call someFunction ;; this will create a stack frame 

+-----------+ 
| param1 | 
+-----------+ 
| param0 | <--- this is [ebp + 8] (assuming mov ebp, esp) 
+-----------+ 
|ret_address| 
+-----------+ 
| ebp | 
+-----------+ <--- esp 

Ve halk için bellek ayrılamadı zaman da biz substract zorunda: ebpESP için bir yedekleme kopyası ise

Ayrıca, ana işlevi Ex EBP değeri nedir ebp'den ... Lütfen belirsiz bir cevap verin. Teşekkür ederiz!

+1

Bir main() işlevi normal bir işlevden farklı değil, bir prolog da var. Montaj snippet'inizde bir tane göstermediniz, neden olduğundan emin değilsiniz. Yerliler için alan, esp değil, esp ayarlanarak oluşturulur. –

+0

Aynı sorular var: http://stackoverflow.com/questions/1395591/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-they-point ve diğer – Abyx

cevap

2

Dediğiniz gibi, yığın aşağı doğru büyür. Yani, yerel halk için yığını aşağı çekmek için çıkarırsınız. Orada saklanan öğeler için yığına geri bakmak için ekleyin.

13

%ebp için başlangıç ​​değeri genellikle 0'dır. Bu, hata ayıklayıcısında bağlantı zincirini takip etmenin ne zaman sona ereceğini çok hata ayıklayıcıdır.

%ebp referans noktası olarak düşünmelisiniz. Kolaylık için, işlev argümanları ve yerel değişkenler arasında yerleştirilir. Bu şekilde, pozitif bir sapma ile argümanlara ve negatif bir ofsete sahip değişkenlere erişirsiniz, böylece bir değişkene veya bir argümana erişip erişmediğinizi anlamak kolaydır.

+0

Neden 0? İlk işlemci açıldığında? – Abyx

+0

'% ebp', genellikle yükleyici veya çalışma zamanı kitaplığı tarafından 0 olarak başlatılır. 0'a ilklendirme bazen resmi bir belgede belirtilir (ör. IIRC ELF x86 psABI bunu belirtir). – ninjalj

+0

Hangi yükleyici veya çalışma zamanı nedir? Belirli bir işletim sistemi hakkında konuşuyorsanız, lütfen açıkça belirtin. İşletim sistemimde "ebp" en azından kullanıcı modunda 0'a başlatılamıyor. Ayrıca, kesin olmak için, kayıt adı 'ebp' değil,% ebp' dir. '%', kayıt adı için bir önektir. – Abyx