C語言函數調用過程--棧幀

  • 什麼是棧幀?
    每一次函數調用都爲這次函數調用開闢一塊空間,這個空間就叫做棧幀。
    首先應該明白,棧是從高地址向低地址延伸的。每個函數的每次調用,都有它自己獨立的一個棧幀,這個棧幀中維持着所需要的各種信息。寄存器ebp指向當前的棧幀的底部(高地址),我們稱爲棧底指針,寄存器esp指向當前的棧幀的頂部(低地址),我們稱爲棧頂指針。
    注意:EBP指向當前位於系統棧最上邊一個棧幀的底部,而不是系統棧的底部。嚴格說來,“棧幀底部”和“棧底”是不同的概念;ESP所指的棧幀頂部和系統棧的頂部是同一個位置。

接下來我們通過下面的這個小程序來進行分析這個過程。
測試環境:vs2012

#include<stdio.h>
#include<stdlib.h>


int Add(int x, int y)
{
    int ret = 0;
    ret = x+y;
    return ret;
}
int main()
{
    int a = 10;
    int b = 20;
    int c = 0;
    c = Add(a, b);   //函數調用時,首先壓了call指令下一條指令的地址,再壓了main函數的棧底,函數調用完了,首先彈出main函數的棧底,再通過ret彈出call指令下一條指令的地址。
    printf("c =%d\n",c);
    system("pause");
    return 0;
}

首先拿出這段程序的彙編代碼
這裏寫圖片描述
這裏寫圖片描述

main函數和Add函數的棧幀如下圖:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章