目錄
一.什么是函式堆疊幀
1.暫存器:
2.函式堆疊幀
3.堆疊幀的作用和維護
4.堆疊幀結構
二.函式堆疊幀的創建
1.匯編代碼
2.main函式函式堆疊幀的創建
1.匯編語言講解:
2.堆疊幀創建:
3.詳細步驟
3.ADD函式堆疊幀的創建
堆疊幀創建:
3.函式堆疊幀的銷毀
1.匯編語言講解
2.詳細步驟
4.識訓和問題
1.函式如何傳參
2.函式回傳值如何回傳
3.函式中變數如何初始化和賦值
4.函式如何呼叫如何回傳
5.函式執行結束后系統進行了什么操作
?
一.什么是函式堆疊幀
1.暫存器:
函式堆疊幀的創建和銷毀離不開暫存器,了解函式堆疊幀之前先了解一下cpu中的暫存器,cpu中供應用程式員使用的暫存器主要有通用暫存器(EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI),段暫存器(CS、DS、SS、ES、FS、GS),標志和控制暫存器(EIP、EFLAGS),其中EBP一般用作基址指標,ESP一般用作堆疊指標,
2.函式堆疊幀
函式被呼叫時,系統會在堆疊區為該函式開辟一塊堆疊空間,這個堆疊空間就是該函式的函式堆疊幀,以main函式的呼叫為例,main函式是被__tmainCRTStartup函式呼叫的,__tmainCRTStartup函式又是被mainCRTStartup函式呼叫的,當main函式被呼叫時就會在堆疊區為其開辟一塊空間來用于main函式的執行,
3.堆疊幀的作用和維護
堆疊幀也叫程序活動記錄,是編譯器用來實作函式呼叫程序的一種資料結構,從邏輯上講,堆疊幀為一個函式提供了執行環境,堆疊是先用高地址再用低地址,堆疊幀控制和保存了一個函式所需要的各種資訊,堆疊幀的維護離不開ebp和esp暫存器,ebp存放了指向堆疊幀的堆疊底地址的指標,esp則存放指向堆疊頂地址的指標,
4.堆疊幀結構
堆疊幀就是堆疊區的一塊空間而已,用main函式的堆疊幀示意圖來說明一下吧,

有堆疊頂指標,堆疊底指標,堆疊區大小E4h個位元組,堆疊幀記憶體放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);
printf("%d", c);
return 0;
}
1.匯編代碼
要研究函式堆疊幀我們要研究c程式的匯編代碼,如圖所示:


2.main函式函式堆疊幀的創建
1.匯編語言講解:


2.堆疊幀創建:

3.詳細步驟





至此main函式的函式堆疊幀的創建和資料初始化就完成了,
3.ADD函式堆疊幀的創建
add函式堆疊幀的創建和main函式堆疊幀創建是一樣的,需要注意的是,ADD函式執行結束后的回傳值保存在了暫存器eax中,就是避免ADD函式堆疊幀銷毀時,主函式無法訪問ADD回傳值,由此可見函式回傳值是如何回傳的,
堆疊幀創建:

3.函式堆疊幀的銷毀
以ADD函式函式堆疊幀的銷毀為例
1.匯編語言講解

2.詳細步驟

main函式函式堆疊幀的創建和銷毀和ADD函式一樣,就不再重復說了,
4.識訓和問題
1.函式如何傳參
以這一段代碼為例

2.函式回傳值如何回傳

3.函式中變數如何初始化和賦值

4.函式如何呼叫如何回傳

5.函式執行結束后系統進行了什么操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292776.html
標籤:其他


