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