EIP、ESP、EBP

1.EIP
2.ESP
3.EBP
1.EIP寄存器裏存儲的是CPU下次要執行的指令的地址
也就是調用完fun函數後,讓CPU知道應該執行main函數中的printf("函數調用結束")語句了。
2.EBP寄存器裏存儲的是是棧的棧底指針,通常叫棧基址,這個是一開始進行fun()函數調用之前,由ESP傳遞給EBP的。(在函數調用前你可以這麼理解:ESP存儲的是棧頂地址,也是棧底地址。)
3.ESP寄存器裏存儲的是在調用函數fun()之後,棧的棧頂。並且始終指向棧頂。

堆棧是一種簡單的數據結構,是一種只允許在其一端進行插入或刪除的線性表。
允許插入或刪除操作的一端稱爲棧頂,另一端稱爲棧底,對堆棧的插入和刪除操作被稱入棧出棧

有一組CPU指令可以實現對進程的內存實現堆棧訪問。其中,POP指令實現出棧操作,PUSH指令實現入棧操作。

CPU的ESP寄存器存放當前線程的棧頂指針

EBP寄存器中保存當前線程的棧底指針

CPU的EIP寄存器存放下一個CPU指令存放的內存地址,當CPU執行完當前的指令後,從EIP寄存器中讀取下一條指令的內存地址,然後繼續執行。

esp和ebp區別

問題:
push ebp
mov esp, ebp
幹嘛要這樣?

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

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

樓主寫的好像是要用GCC來編譯的彙編? 

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是在堆棧中尋址用的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章