C語言函數棧幀解析
一、什麼是函數棧幀
1.寄存器:
eax, ebx, ecx …
ebp
– 存放瞭指向函數棧幀棧底的地址
esp
– 存放瞭指向函數棧幀棧頂的地址
2.函數棧幀
函數被調用時,系統會在棧區為該函數開辟一塊棧空間,這個棧空間就是該函數的函數棧幀。
以main函數的調用為例
3.棧幀的作用和維護
棧幀也叫過程活動記錄,是編譯器用來實現函數調用過程的一種數據結構。從邏輯上講,棧幀為一個函數提供瞭執行環境。
棧是先用高地址再用低地址,棧幀控制和保存瞭一個函數所需要的各種信息。
棧幀的維護離不開ebp和esp寄存器,ebp存放瞭指向棧幀的棧底地址的指針,esp則存放指向棧頂地址的指針。
4.棧幀結構
以main函數為例:
二、函數棧幀的創建
環境為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.匯編代碼
要研究函數棧幀我們要研究c程序的匯編代碼。如圖所示:
2.main函數
2.棧幀創建:
3.步驟
main函數的函數棧幀的創建和數據初始化就完成瞭。
4.ADD函數棧幀的創建
add函數棧幀的創建和main函數棧幀創建是一樣的,值得註意的是,ADD函數執行結束後的返回值保存在瞭寄存器eax中,就是避免ADD函數棧幀銷毀時,主函數無法訪問ADD返回值。由此可見函數返回值是如何返回的。
三.函數棧幀的銷毀
1.匯編語言
四.瞭解
1.函數傳參
2.函數返回值如何返回
3.函數中變量如何初始化和賦值
4.函數執行結束後系統進行瞭什麼操作
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容
推薦閱讀:
- C語言函數基礎教程分類自定義參數及調用示例詳解
- C語言中#define定義的標識符和宏實例代碼
- C語言深度解剖篇之關鍵字以及補充內容
- C語言超全面覆蓋操作符知識點
- C語言中各種操作符的詳細介紹(純幹貨!)