SORU
8 EYLÜL 2009, Salı


Base pointer ve işaretçi yığını nedir tam olarak? Neye işaret ediyorlar?

this example DrawSquare wikipedia, gelen kullanma() doğru, dikdörtgen aramaları(),

alt text

herkes ebp ve esp bu bağlamda bana açıklayabilir mi?

Gördüğüm kadarıyla, her zaman yığın ve geçerli işlevin uzaklaştırmak için temel işaretçiyi üstüne yığın işaretçisi puan diyebilirim? Ya da ne?

Teşekkürler

edit: windows programları kapsamında bu yani

edit2: Ve nasıl doğrudan mı çalışıyor?

edit3:MSVC aşağıdaki kodu var :

var_C= dword ptr -0Ch
var_8= dword ptr -8
var_4= dword ptr -4
hInstance= dword ptr  8
hPrevInstance= dword ptr  0Ch
lpCmdLine= dword ptr  10h
nShowCmd= dword ptr  14h

Hepsi DWORD olmak, böylece her 4 bayt alıyor gibi görünüyor. 4 bayt var_4 için hınstance bir boşluk var yani. Onlar nelerdir? Wikipedia resimde de görüldüğü gibi dönüş adresi olduğunu sanıyorum?

Michael cevap:

var_C= Ao -0Ch dword

-8 dword bildiğimiz var_8=

-4 dword bildiğimiz var_4=

dword= 0 Ao savedFramePointer

iade adresi= Ao 4 dword

hınstance= Ao 8s dword

Prevınstance= Ao 0 C dword

hlpCmdLine= Ao 10 dword

nShowCmd= Ao 14 H dword

Bu işlev çağrısı akışını olmasıdır:

* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals

Benim sorum (son, umarım!) şimdi, giriş sonuna kadar aramak istiyorum fonksiyonun argümanları ben pop andan itibaren neler olup bittiğini tam olarak nedir? Bilmek istiyorum nasıl ebp, esp evrim sırasında o anlar(ben zaten anladım nasıl giriş çalışır, ben sadece bilmek istiyorum ne oluyor sonra ittim argümanlar yığını ve önce giriş).

CEVAP
8 EYLÜL 2009, Salı


esp dediğin gibi, yığının üstünde.

ebp genellikle işlevi başında esp ayarlanır. Yerel değişkenler sabit ebp uzaklığı çıkarılarak erişilir. Tüm x 86 arama kuralları işlev çağrıları arasında korunmuş olarak tanımlamak ebp. ebp kendisi aslında iş için bir hata ayıklayıcı yürüyüş yığını ve diğer çerçeveler yerel değişkenler görüntüleme sağlayan bir önceki çerçevenin temel işaretçi, işaret eder.

Çoğu işlevi prologs gibi bir şey:

push ebp      ; Preserve current frame pointer
mov ebp, esp  ; Create new frame pointer pointing to current stack top
sub esp, 20   ; allocate 20 bytes worth of locals on stack.

İşlevi daha sonra gibi bir kod (yerel değişkenler küstah 4 bayt) olabilir

mov [ebp-4], eax    ; Store eax in first local
mov ebx, [ebp - 8]  ; Load ebx from second local

FPO veya çerçeve göstericisi ihmal optimizasyonu hangi sağlayacaktır ortadan kaldırmak aslında bu ebp olarak başka bir kayıt ve erişim yerliler doğrudan kapalı esp yapar, ama bu hata ayıklama biraz daha zor beri hata artık doğrudan erişim yığın çerçeveler önceki işlevini çağırır.

DÜZENLEME:

Güncelleştirilmiş bir soru için, yığın içinde kaybolan iki girişi vardır:

var_C = dword ptr -0Ch
var_8 = dword ptr -8
var_4 = dword ptr -4
*savedFramePointer = dword ptr 0*
*return address = dword ptr 4*
hInstance = dword ptr  8h
PrevInstance = dword ptr  0C
hlpCmdLine = dword ptr  10h
nShowCmd = dword ptr  14h

Bu işlev çağrısı akışını olmasıdır:

  • Parametreleri (hınstance, vb.) itme
  • İade adresi iter işlevini çağırın
  • Ebp Push
  • Yerliler için yer ayırma

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BurnedInDotCom

    BurnedInDotC

    3 NİSAN 2010
  • Techmoan

    Techmoan

    31 Mayıs 2009
  • WK

    WK

    9 Ocak 2006