彙編指令ebp與esp的關係與作用
可以看到,初始情況下,ebp此時值為0012FEDC,也就是棧幀的地址,而棧頂地址esp值為0012FDFC。可以看到兩個值有一定的關係。而 幀指標 的地址較高。
可以看到前兩句已經執行了,那麼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的初始地址麼?
所以我們在囉唆幾句:
1、兩句的mov ebp,esp實際上是把ebp進棧後的棧頂地址給了ebp。
2、在ebp沒有出棧錢,它會一直儲存ebp進棧以後的棧頂值,也就是1的值。
3、在ebp出棧前,需要把esp恢復到只有ebp在棧中時的值。
4、出棧後,esp自然恢復到ebp進棧以前的初始值,而pop ebp則恢復了ebp的初始值。
5、pop的語義很重要,pop
轉自:http://hi.baidu.com/anheizzq/item/1c0899622926c81e7ddecca3