2016-03-16 13 views
6

Neden Meclis İşlevi'nin ilk eylemi olarak push ebp yapıyoruz?Montajda CALLEE'de neden "PUSH EBP" ve "MOV EBP, ESP" ler var?

Anlaşılan değişkenleri almak için mov edi, [ebp+8] kullanın, ancak bizim esp zaten Arayan işlevinin dönmek için işaret ediyor. mov edi, [esp+4] ile geçirilen değişkenlere kolayca erişebilir veya Callee kayıtlarını ittiğimizde mov edi, [esp+16].

Peki, neden daha sonra işlevlerde yönetmek zorunda olduğunuz CPU'da (ebp) ek kayıt var? yani

push ebp 
mov ebp, esp 

... 

mov esp, ebp 
pop ebp 
+3

Yapmak zorunda değilsiniz. Fonksiyonlar değişken uzunluklu diziler veya alloca() 'kullanmıyorsa, derleyiciler genellikle çerçeve işaretçisini atlarlar. – EOF

+0

Olası çoğaltılabilir [Tam olarak temel işaretçi ve yığın işaretçisi nedir? Ne için işaret ediyorlar?] (Http://stackoverflow.com/questions/1395591/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-they-point) –

+0

Neden? Başlıkta bütün başlıklara "CALLEE" yazdınız mı? Arayan kişinin çağrı çerçevesinin bir parçası olarak neden yığın çerçevelerini oluşturduğunu merak ediyor musunuz? Bu başlık, başlık dışındaki metne bağlı olarak ses çıkarmaz. –

cevap

4

arayanın yığın çerçevesi korurken, Aranan içinde yeni stack frame kurmaktadır. Yığın çerçevesi, işlevde EBP'a göre sabit uzaklıklar kullanılarak geçirilen parametrelere ve yerel değişkenlere tutarlı erişim sağlarken, ESP işlevi, işlev çalışırken gerektiğinde değiştirilmeye devam etmekte serbesttir. ESP, hareketli bir hedeftir, bu nedenle ESP'a göre dinamik ofsetleri kullanarak parametrelere ve değişkenlere erişmek, fonksiyonun yığının nasıl kullanıldığına bağlı olarak, imkansız değilse de zor olabilir. Yığın çerçevesinin oluşturulması genellikle, işaretçiyi arayanın yığın çerçevesine korumak için birkaç baytlık yığın alanı kullanmanın maliyeti ile daha güvenlidir.

+0

Bir çerçeve işaretçisini tutma maliyeti, tek bir [itme [r/e] bp'de değil, bir kayıt defterinde kayıtlı bir kayıt defterinden ücretsiz olarak yararlanır (veya * çok * 32 bit) mimarlık. – EOF

+0

Değişkenlere dinamik bir dengeleme sahip olmak insanlara kafa karıştırıcı olabilir, ancak bir Derleyici için gerçekten gerekli midir? Ek yük gerçekten buna değer mi? – Grigio

+0

@EOF '[R/E] BP', özellikle yığın çerçevesi işaretçisi olarak kullanılmak üzere ayrılmıştır. Örneğin, [R/E] AX' gibi genel amaçlı bir kayıt değildir. –

İlgili konular