EBP、ESP作用——esp始終指向棧頂,ebp是在堆棧中尋址用的(就是臨時變量嘛)


基本概念:

(1)ESP:棧指針寄存器(extended stack pointer),其內存放着一個指針,該指針永遠指向系統棧最上面一個棧幀的棧頂。

(2)EBP:基址指針寄存器(extended base pointer),其內存放着一個指針,該指針永遠指向系統棧最上面一個棧幀的底部。


————————————————————— 

以下摘自網上一篇文章: 

push       ebp            ;ebp入棧 
mov     ebp, esp          ;因為esp是堆棧指針,無法暫借使用,所以得用ebp來存取堆棧 
sub      esp, 4*5         ;下面的wsprintf一共使用了5個參數,每個參數占用4個字節,所以要入棧4*5個字節 
push    1111 
push    2222 
push    3333 
push    offset szFormat 
push    offset szOut 
call      wsprintf          ;調用wsprintf 
add     esp, 4*5        ;堆棧使用完畢,“還”回4*5個字節給系統 
… 
mov    esp, ebp        ;恢復esp的值 
pop    ebp           ;ebp出棧 
ret 

明白了嗎?主要是用來保存/恢復堆棧,以便傳遞參數給函數。 
在MASM里面,有一條更方便的語句,就是invoke 
使用它后,你就不用自己做這些事情了。 

————————————————————— 

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


我的理解:

調用一個函數時,先將堆棧原先的基址(EBP)入棧,以保存之前任務的信息。然后將棧頂指針的值賦給EBP,將之前的棧頂作為新的基址(棧底),然后再這個基址上開辟相應的空間用作被調用函數的堆棧。函數返回后,從EBP中可取出之前的ESP值,使棧頂恢復函數調用前的位置;再從恢復后的棧頂可彈出之前的EBP值,因為這個值在函數調用前一步被壓入堆棧。這樣,EBP和ESP就都恢復了調用前的位置,堆棧恢復函數調用前的狀態。

二.通過ollydbg跟蹤esp和ebp

這里寫圖片描述

可以看到,初始情況下,ebp此時值為0012FEDC,也就是棧幀的地址,而棧頂地址esp值為0012FDFC。可以看到兩個值有一定的關系。而幀指針的地址較高。

 

然后我們讓它執行前兩句,push ebp,mov ebp,esp
這里寫圖片描述

可以看到前兩句已經執行了,那么ebp跟esp的值也發生了變化。esp=0012FDF8,ebp=0012FDF8。為神馬?一句句解讀,push ebp,向棧里面壓入了一個東西,那么棧頂此時應該發生變化了,也就是地址-4字節。為什嗎是減法呢?因為是向低地址增長的,這點一定得注意。所以此時esp變化成了0012FDFC-4=OO12FDF8.至於ebp也等於0012FDF8就不解釋了。

 

接着上圖不解釋:
這里寫圖片描述

此時呢,觀察現在的值。棧頂esp=0012FDF4,而ebp=0012FDF8;沒啥好說的,此時的棧頂已經又跑上去了,說明又有元素壓棧了。那么執行這句mov esp,ebp之后,不用說,esp跟ebp都會變成0012FDF8.

我們重點看下一幅,執行完pop,讓ebp出棧,后會發生神馬。

這里寫圖片描述
此時ebp已經出棧了,來看看那他們的值,esp=0012FDFC,ebp=0012FEDC.首先,ebp出棧了,這個時候棧空了,所以棧頂會變成初始時的值001212FDFC。相當於上圖中的esp=0012FDF8+4=0012FDFC.注意出棧,則棧頂+4,然后呢。ebp為啥變成了0012FEDC初始的值?ebp不是一直保存着esp的初始地址么?
所以重點就在pop這個語句了。pop ebp究竟表達神馬意思?ebp的值起初存在了棧中,出棧以后,它的值就恢復了原樣。所一句灰常重要啊。pop的意思也許就是把彈出的值賦給我們的變量,pop ebp,也就是把存在棧中的值彈出來賦給ebp。
所以我在這里總結幾句:
1、兩句的mov ebp,esp實際上是把ebp進棧后的棧頂地址給了ebp。
2、在ebp沒有出棧錢,它會一直保存ebp進棧以后的棧頂值,也就是1的值。
3、在ebp出棧前,需要把esp恢復到只有ebp在棧中時的值。
4、出棧后,esp自然恢復到ebp進棧以前的初始值,而pop ebp則恢復了ebp的初始值。
5、pop的語義很重要,pop ebp的意思是把當前棧頂的元素出棧,送入ebp中,而不是讓ebp出棧,這點必須明確!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM