日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对esp和ebp分析来了解函数的调用过程

發布時間:2023/12/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对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反匯編的代碼為:

12: int function_add(int a,int b) 13: { 004010A0 55 push ebp 004010A1 8B EC mov ebp,esp 004010A3 83 EC 40 sub esp,40h 004010A6 53 push ebx 004010A7 56 push esi 004010A8 57 push edi 004010A9 8D 7D C0 lea edi,[ebp-40h] 004010AC B9 10 00 00 00 mov ecx,10h 004010B1 B8 CC CC CC CC mov eax,0CCCCCCCCh 004010B6 F3 AB rep stos dword ptr [edi] 14: return a+b; 004010B8 8B 45 08 mov eax,dword ptr [ebp+8] 004010BB 03 45 0C add eax,dword ptr [ebp+0Ch] 15: 16: } 004010BE 5F pop edi 004010BF 5E pop esi 004010C0 5B pop ebx 004010C1 8B E5 mov esp,ebp 004010C3 5D pop ebp 004010C4 C3 ret

我們可以看到在函數前面,首先將ebp壓入棧,然后將esp的值賦值給ebp,此時
esp=M-16,ebp的值和esp相同

push ebp mov 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來操作數據很方便
在最后:

004010C1 8B E5 mov esp,ebp 004010C3 5D pop ebp

將esp,ebp的值變成調用function_add之前的值,這樣看起來只是實現函數的功能,其他并沒有啥變化,再使用ret語句,返回去,然后繼續往下執行語句

0040105A 83 C4 08 add esp,8

總結:

  • esp始終指向棧頂,ebp只要在調用函數時,取值為棧頂,這樣可方便對數據的操作
  • 函數調用時,EBP的值入棧,然后ESP的值傳給EBP。函數調用結束后,EBP將值傳回ESP,ESP又指向了原來的棧頂地址。這樣看起來只是實現函數的功能,其他看起來沒有變化
  • 總結

    以上是生活随笔為你收集整理的对esp和ebp分析来了解函数的调用过程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。