对esp和ebp分析来了解函数的调用过程
esp:擴展棧指針寄存器,是指針寄存器的一種,用于存放函數棧頂指針(棧頂指針)
ebp:擴展基址指針寄存器,也被稱為幀指針寄存器,用于存放函數棧底指針(棧底指針)。
esp和ebp有什么關系呢?
ebp只是存取某時刻的esp,這個時刻就是進入一個函數內后,cpu會將esp的值賦給ebp,此時就可以通過ebp對棧進行操作,比如獲取函數參數,局部變量等,實際上使用esp也可以,只是esp可能會變化,去數據的時候很不方便
下面我們通過一個例子來說明:
#include "stdio.h"int function_add(int a,int b); int main() {int a=1,b=1,sum=0;sum=function_add(a,b);printf("sum=%d",sum);return 0; } int function_add(int a,int b) {return a+b;}這段程序的功能是定義一個函數,實現兩個參數相加,然后打印出來,下面來分析,
int a=1,b=1,sum=0;sum=function_add(a,b);這兩句反匯編如下:
7: int a=1,b=1,sum=0; 00401038 C7 45 FC 01 00 00 00 mov dword ptr [ebp-4],1 ;偏移地址為[ebp-4]存放1 0040103F C7 45 F8 01 00 00 00 mov dword ptr [ebp-8],1 ;偏移地址為[ebp-8]存放1 00401046 C7 45 F4 00 00 00 00 mov dword ptr [ebp-0Ch],0 ;偏移地址為[ebp-0ch]存放0 8: sum=function_add(a,b); 0040104D 8B 45 F8 mov eax,dword ptr [ebp-8] ;eax的值設置為1 00401050 50 push eax ;壓入棧 00401051 8B 4D FC mov ecx,dword ptr [ebp-4] ;ecx的值設置為1 00401054 51 push ecx ;入棧 00401055 E8 AB FF FF FF call @ILT+0(function_add) (00401005) 0040105A 83 C4 08 add esp,8 0040105D 89 45 F4 mov dword ptr [ebp-0Ch],eax當執行到這段代碼會調到function_add函數執行
call @ILT+0(function_add) (00401005)這段一共push兩次,假設在沒有這兩次push前,設esp=M,push兩次后,esp=M-8
執行call語句 esp=M-12
function_add反匯編的代碼為:
我們可以看到在函數前面,首先將ebp壓入棧,然后將esp的值賦值給ebp,此時
esp=M-16,ebp的值和esp相同
此時棧里情況為:
在函數里,都是通過ebp對棧的數據進行操作的,比如獲取參數的值,
004010B8 8B 45 08 mov eax,dword ptr [ebp+8] 004010BB 03 45 0C add eax,dword ptr [ebp+0Ch]因為在函數里,esp的值可能是變化的,ebp的值不變,通過ebp來操作數據很方便
在最后:
將esp,ebp的值變成調用function_add之前的值,這樣看起來只是實現函數的功能,其他并沒有啥變化,再使用ret語句,返回去,然后繼續往下執行語句
0040105A 83 C4 08 add esp,8總結:
總結
以上是生活随笔為你收集整理的对esp和ebp分析来了解函数的调用过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三亚旅游团多少钱啊?
- 下一篇: C和汇编混合编程----实现浮点数的加减