午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

ebp與esp講解

 Fredanf 2013-03-09

ebp與esp講解

分類: C vs C++ 156人閱讀 評(píng)論(0) 收藏 舉報(bào)

一.概念分析

經(jīng)??吹较旅孢@兩句:

pushl %ebp 
movl %esp,%ebp 

--------------------------------------------------------------------------------
  esp是堆棧指針  
  ebp是基址指針 

那兩條指令的意思是 將棧頂指向 ebp 的地址  
--------------------------------------------------------------- 

以下摘自網(wǎng)上一篇文章: 

push    ebp             ;ebp入?!?nbsp;
mov     ebp, esp        ;因?yàn)閑sp是堆棧指針,無(wú)法暫借使用,所以得用ebp來(lái)存取堆?!?nbsp;
sub     esp, 4*5        ;下面的wsprintf一共使用了5個(gè)參數(shù),每個(gè)參數(shù)占用4個(gè)字節(jié),所以要入棧4*5個(gè)字節(jié)  
push    1111  
push    2222  
push    3333  
push    offset szFormat  
push    offset szOut  
call    wsprintf        ;調(diào)用wsprintf  
add     esp, 4*5        ;堆棧使用完畢,“還”回4*5個(gè)字節(jié)給系統(tǒng)  
...  
mov     esp, ebp        ;恢復(fù)esp的值  
pop     ebp             ;ebp出?!?nbsp;
ret 


明白了嗎?主要是用來(lái)保存/恢復(fù)堆棧,以便傳遞參數(shù)給函數(shù)?!?nbsp;
在MASM里面,有一條更方便的語(yǔ)句,就是invoke  
使用它后,你就不用自己做這些事情了?!?/p>

--------------------------------------------------------------- 

esp始終指向棧頂,ebp是在堆棧中尋址用的 

***********************************************************************************************

我的理解:

調(diào)用一個(gè)函數(shù)時(shí),先將堆棧原先的基址(EBP)入棧,以保存之前任務(wù)的信息。然后將棧頂指針的值賦給EBP,將之前的棧頂作為新的基址(棧底),然后再這個(gè)基址上開(kāi)辟相應(yīng)的空間用作被調(diào)用函數(shù)的堆棧。函數(shù)返回后,從EBP中可取出之前的ESP值,使棧頂恢復(fù)函數(shù)調(diào)用前的位置;再?gòu)幕謴?fù)后的棧頂可彈出之前的EBP值,因?yàn)檫@個(gè)值在函數(shù)調(diào)用前一步被壓入堆棧。這樣,EBP和ESP就都恢復(fù)了調(diào)用前的位置,堆?;謴?fù)函數(shù)調(diào)用前的狀態(tài)。

二.通過(guò)ollydbg跟蹤esp和ebp

           發(fā)現(xiàn)文字描述還是太沒(méi)有快感。上幾幅圖,來(lái)說(shuō)明這個(gè)調(diào)試過(guò)程更好。此文對(duì)于深刻理解ebp,esp是具有長(zhǎng)遠(yuǎn)意義的


     可以看到,初始情況下,ebp此時(shí)值為0012FEDC,也就是棧幀的地址,而棧頂?shù)刂積sp值為0012FDFC??梢钥吹絻蓚€(gè)值有一定的關(guān)系。而幀指針的地址較高。

     然后我們讓它執(zhí)行前兩句,push ebp,mov ebp,esp


        可以看到前兩句已經(jīng)執(zhí)行了,那么ebp跟esp的值也發(fā)生了變化。esp=0012FDF8,ebp=0012FDF8。為神馬?一句句解讀,push ebp,向棧里面壓入了一個(gè)東西,那么棧頂此時(shí)應(yīng)該發(fā)生變化了,也就是地址-4字節(jié)。為什嗎是減法呢?因?yàn)槭?strong>向低地址增長(zhǎng)的,這點(diǎn)一定得注意。所以此時(shí)esp變化成了0012FDFC-4=OO12FDF8.至于ebp也等于0012FDF8就不解釋了。

       接著上圖不解釋:


   此時(shí)呢,觀察現(xiàn)在的值。棧頂esp=0012FDF4,而ebp=0012FDF8;沒(méi)啥好說(shuō)的,此時(shí)的棧頂已經(jīng)又跑上去了,說(shuō)明又有元素壓棧了。那么執(zhí)行這句mov esp,ebp之后,不用說(shuō),esp跟ebp都會(huì)變成0012FDF8.我們重點(diǎn)看下一幅,執(zhí)行完pop,讓ebp出棧,后會(huì)發(fā)生神馬。


      此時(shí)ebp已經(jīng)出棧了,來(lái)看看那他們的值,esp=0012FDFC,ebp=0012FEDC.首先,ebp出棧了,這個(gè)時(shí)候棧空了,所以棧頂會(huì)變成初始時(shí)的值001212FDFC。相當(dāng)于上圖中的esp=0012FDF8+4=0012FDFC.注意出棧,則棧頂+4,然后呢。ebp為啥變成了0012FEDC初始的值?ebp不是一直保存著esp的初始地址么?

       所以重點(diǎn)就在pop這個(gè)語(yǔ)句了。pop ebp究竟表達(dá)神馬意思?ebp的值起初存在了棧中,出棧以后,它的值就恢復(fù)了原樣。所一句灰常重要啊。pop的意思也許就是把彈出的值賦給我們的變量,pop  ebp,也就是把存在棧中的值彈出來(lái)賦給ebp。

        所以我在這里總結(jié)幾句:

1、兩句的mov ebp,esp實(shí)際上是把ebp進(jìn)棧后的棧頂?shù)刂方o了ebp。

2、在ebp沒(méi)有出棧錢,它會(huì)一直保存ebp進(jìn)棧以后的棧頂值,也就是1的值。

3、在ebp出棧前,需要把esp恢復(fù)到只有ebp在棧中時(shí)的值。

4、出棧后,esp自然恢復(fù)到ebp進(jìn)棧以前的初始值,而pop ebp則恢復(fù)了ebp的初始值。

5、pop的語(yǔ)義很重要,pop  ebp的意思是把當(dāng)前棧頂?shù)脑爻鰲#腿雃bp中,而不是讓ebp出棧,這點(diǎn)必須明確!


這下應(yīng)該明白了吧~~~~

參考網(wǎng)上資源:

          http://blog.csdn.net/running_noodle/article/details/2838679

          http://hi.baidu.com/anheizzq/item/1c0899622926c81e7ddecca3

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多