C語言函數(shù)棧幀解析
一、什么是函數(shù)棧幀
1.寄存器:
eax, ebx, ecx ...
ebp - 存放了指向函數(shù)棧幀棧底的地址
esp - 存放了指向函數(shù)棧幀棧頂?shù)牡刂?/p>
2.函數(shù)棧幀
函數(shù)被調(diào)用時,系統(tǒng)會在棧區(qū)為該函數(shù)開辟一塊??臻g,這個??臻g就是該函數(shù)的函數(shù)棧幀。
以main函數(shù)的調(diào)用為例

3.棧幀的作用和維護(hù)
棧幀也叫過程活動記錄,是編譯器用來實現(xiàn)函數(shù)調(diào)用過程的一種數(shù)據(jù)結(jié)構(gòu)。從邏輯上講,棧幀為一個函數(shù)提供了執(zhí)行環(huán)境。
棧是先用高地址再用低地址,棧幀控制和保存了一個函數(shù)所需要的各種信息。
棧幀的維護(hù)離不開ebp和esp寄存器,ebp存放了指向棧幀的棧底地址的指針,esp則存放指向棧頂?shù)刂返闹羔槨?/p>
4.棧幀結(jié)構(gòu)
以main函數(shù)為例:
二、函數(shù)棧幀的創(chuàng)建
環(huán)境為VS2019
#include<stdio.h>
int ADD(int x, int y)
{
int z=0;
z=x+y;
return z;
}
int main()
{
int a = 10;
int b = 20;
int c = 0;
c = ADD(a, b);
return 0;
}
1.匯編代碼
要研究函數(shù)棧幀我們要研究c程序的匯編代碼。如圖所示:

2.main函數(shù)

2.棧幀創(chuàng)建:
3.步驟






main函數(shù)的函數(shù)棧幀的創(chuàng)建和數(shù)據(jù)初始化就完成了。
4.ADD函數(shù)棧幀的創(chuàng)建

add函數(shù)棧幀的創(chuàng)建和main函數(shù)棧幀創(chuàng)建是一樣的,值得注意的是,ADD函數(shù)執(zhí)行結(jié)束后的返回值保存在了寄存器eax中,就是避免ADD函數(shù)棧幀銷毀時,主函數(shù)無法訪問ADD返回值。由此可見函數(shù)返回值是如何返回的。
三.函數(shù)棧幀的銷毀
1.匯編語言

四.了解
1.函數(shù)傳參

2.函數(shù)返回值如何返回

3.函數(shù)中變量如何初始化和賦值

4.函數(shù)執(zhí)行結(jié)束后系統(tǒng)進(jìn)行了什么操作

總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容
相關(guān)文章
C++實現(xiàn)學(xué)校運動會管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)學(xué)校運動會管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-10-10

