函数调用过程简单分析
C/C++函數(shù)調(diào)用過程分析
這里以一個(gè)簡單的C語言代碼為例,來分析函數(shù)調(diào)用過程
代碼:
1 #include <stdio.h> 2 3 int func(int param1 ,int param2,int param3) 4 { 5 int var1 = param1; 6 int var2 = param2; 7 int var3 = param3; 8 9 printf("var1=%d,var2=%d,var3=%d",var1,var2,var3); 10 return var1; 11 } 12 13 int main(int argc, char* argv[]) 14 { 15 int result = func(1,2,3); 16 17 return 0; 18 }?
首先說明,在堆棧中變量分布是從高地址到低地址分布,EBP是指向棧底的指針,在過程調(diào)用中不變,又稱為幀指針。ESP指向棧頂,程序執(zhí)行時(shí)移動,ESP減小分配空間,ESP增大釋放空間,ESP又稱為棧指針。
?
下面來逐步分析函數(shù)的調(diào)用過程
1.函數(shù)main執(zhí)行,main各個(gè)參數(shù)從右向左逐步壓入棧中,最后壓入返回地址
2.執(zhí)行第15行,3個(gè)參數(shù)以從左向右的順序壓入堆棧,及從param3到param1,棧內(nèi)分布如下圖:
?3.然后是返回地址入棧:此時(shí)的棧內(nèi)分布如下:
4.第3行函數(shù)調(diào)用時(shí),通過跳轉(zhuǎn)指令進(jìn)入函數(shù)后,函數(shù)地址入棧后,EBP入棧,然后把當(dāng)前ESP的值給EBP,對應(yīng)的匯編指令:
push ebp mov ebp esp? ?此時(shí)棧頂和棧底指向同一位置,棧內(nèi)分布如下:
?
5.第5行開始執(zhí)行,?int var1 = param1; int var2 = param2; int var3 = param3;按申明順序依次存儲。對應(yīng)的匯編:
mov 0x8(%ebp),%eax mov %eax,-0x4(%ebp)? 其中將[EBP+0x8]地址里的內(nèi)容賦給EAX,即把param的值賦給EAX,然后把EAX的中的值放到[EBP-4]這個(gè)地址里,即把EAX值賦給var1,完成C代碼?int var1 = param1,其他變量雷同。
6.第9行,輸出結(jié)果,第10行執(zhí)行 對應(yīng)的匯編代碼:
mov -0x4(%ebp),%eax?最后通過eax寄存器保存函數(shù)的返回值;
?
?
7.調(diào)用執(zhí)行函數(shù)完畢,局部變量var3,var2,var1一次出棧,EBP恢復(fù)原值,返回地址出棧,找到原執(zhí)行地址,param1,param2,param3依次出棧,函數(shù)調(diào)用執(zhí)行完畢。圖略
總結(jié)
以上是生活随笔為你收集整理的函数调用过程简单分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2013 加快编译速度 的方法整理
- 下一篇: qt安装