天天看點

c程式的調用過程-----棧幀

對一個簡單的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函數棧幀的分析:

c程式的調用過程-----棧幀
c程式的調用過程-----棧幀
c程式的調用過程-----棧幀
c程式的調用過程-----棧幀
c程式的調用過程-----棧幀

調用fun函數時:

c程式的調用過程-----棧幀

傳回main函數後:

c程式的調用過程-----棧幀

main函數和fun函數的棧幀示意圖:

c程式的調用過程-----棧幀

繼續閱讀