一.概念分析 經(jīng)??吹较旅孢@兩句:
pushl %ebp
--------------------------------------------------------------------------------
那兩條指令的意思是 將棧頂指向 ebp 的地址 以下摘自網(wǎng)上一篇文章:
push ebp ;ebp入棧
--------------------------------------------------------------- esp始終指向棧頂,ebp是在堆棧中尋址用的 *********************************************************************************************** 我的理解: 調(diào)用一個(gè)函數(shù)時(shí),先將堆棧原先的基址(EBP)入棧,以保存之前任務(wù)的信息。然后將棧頂指針的值賦給EBP,將之前的棧頂作為新的基址(棧底),然后再這個(gè)基址上開辟相應(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)意義的
然后我們讓它執(zhí)行前兩句,push ebp,mov 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ù)脑爻鰲?,送入ebp中,而不是讓ebp出棧,這點(diǎn)必須明確! 這下應(yīng)該明白了吧~~~~ 參考網(wǎng)上資源: |
|