對一個簡單的c程式的函數調用過程的分析:
在main函數中調用fun函數:
1).先将main函數的ebp入棧,以儲存之前任務的資訊。
2).然後将main函數的esp的值賦給ebp,即就是讓ebp指向esp指向的空間,讓ebp做為fun函數的棧底
3).然後将esp的值sub某個值,也就是為fun函數開辟新的棧空間。
4).fun函數調用結束後,将esp指向ebp的位址,使目前棧幀的ebp恢複為main函數的棧頂。
5)然後從main函數的棧頂彈出main函數的ebp(因為在調用fun 函數之前儲存了main函數的ebp),使得ebp恢複為調用fun函數之前main函數的棧底,接着彈出esp的内容–儲存的call指令的下一條指令的位址,然後
esp指向指向這個位址。則這時esp和ebp都恢複為調用fun函數之前的位置。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int fun(int x, int y)
{
int c = ;
return c;
}
int main()
{
int a = ;
int b = ;
int ret = fun(a, b);
printf("you should running here!\n");
system("pause");
return ;
}
對main函數棧幀的分析:
調用fun函數時:
傳回main函數後:
main函數和fun函數的棧幀示意圖: