關于 棧幀變化完整流程圖(函數嵌套)

一、什么是棧幀(Stack Frame)

當一個函數被調用時,會在棧上開辟一段空間,叫做 棧幀
每個棧幀保存了:

  • 函數的參數

  • 返回地址(從哪里跳回來)

  • 上一個棧幀的棧底指針(保存調用者的 EBP / FP)

  • 局部變量

  • 保存的一些寄存器(可選)


二、函數嵌套調用例子

以 C 為例:

void C() {int c = 3;
}void B() {int b = 2;C();
}void A() {int a = 1;B();
}int main() {A();return 0;
}

三、每次函數調用的棧幀結構(以 x86 為例)

棧增長方向:從高地址向低地址

每次調用棧幀大致如下(從下到上):

高地址
│
│  上一幀的 EBP(caller 的棧底)
│  返回地址(RET)
│  參數(如有)
│  局部變量(如 int x)
│
↓
低地址

四、函數嵌套時完整棧幀流程圖

以調用鏈 main → A → B → C 為例,假設每層函數內部有 1 個 int 局部變量。

初始狀態:
棧空main() 被調用:
+-------------------+ ← ESP,EBP(main 的棧底)
| 返回地址          |
+-------------------+
| 局部變量 return=0 |
+-------------------+main() → A()
+-------------------+ ← ESP(當前)
| 返回地址(main)    |
+-------------------+
| 上一幀的 EBP      |
+-------------------+
| 局部變量 a=1      |
+-------------------+A() → B()
+-------------------+
| 返回地址(A)       |
+-------------------+
| 上一幀的 EBP      |
+-------------------+
| 局部變量 b=2      |
+-------------------+B() → C()
+-------------------+
| 返回地址(B)       |
+-------------------+
| 上一幀的 EBP      |
+-------------------+
| 局部變量 c=3      |
+-------------------+棧頂 (ESP)

五、函數返回時的棧幀回退過程

函數返回時,會彈出當前棧幀,恢復上一個函數的棧幀(EBP 和 RET 地址)。

C() return → ESP 恢復到 B()
B() return → ESP 恢復到 A()
A() return → ESP 恢復到 main()
main() return → 程序結束

六、流程圖總結

main
│
├── 調用 A()
│   │
│   └── 調用 B()
│       │
│       └── 調用 C()
│
└── 每層函數進棧,棧幀不斷疊加每層函數返回,棧幀依次彈出

七、可視化理解

棧頂
│
│  C 的局部變量
│  返回地址(B)
│
│  B 的局部變量
│  返回地址(A)
│
│  A 的局部變量
│  返回地址(main)
│
│  main 的局部變量
│  返回地址(操作系統)
↓
棧底

八、匯編視角分析

以 x86 為例,函數調用時常見的指令:

CALL func   ; 壓入返回地址 → 跳轉
PUSH EBP    ; 保存當前幀
MOV EBP, ESP; 建立新棧幀
SUB ESP, n  ; 為局部變量分配空間
...
MOV ESP, EBP; 恢復 ESP
POP EBP     ; 恢復上層棧幀
RET         ; 彈出返回地址

九、總結

步驟棧幀變化關鍵指令
函數調用新棧幀入棧CALLPUSH EBP
建立棧幀保存舊幀 & 分配空間MOV EBP, ESPSUB ESP, n
函數返回彈出棧幀MOV ESP, EBPPOP EBPRE

補充:

  • 在 x86_64 下,函數參數會用寄存器傳遞(如 RDI、RSI)

  • 在 ARM64 下,棧幀也有 FP/LR(Frame Pointer / Link Register)結構

  • 調用鏈跟蹤調試可用 gdb、ida、ghidra 中的棧回溯(backtrace)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87748.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87748.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

new與malloc[c++面試系列]

new與malloc的區別new順從c的思想,在堆區申請一個對象,因此它會調用對象的構造函數進行初始化,它也應該調用構造函數;malloc在堆區申請一塊空間,用于存放資源new無需指定對象大小,可以自動計算對象大小進行…

Go語言的sync.Once和sync.Cond

一.sync.OnceOnce(單次執行)用途:確保某個操作只執行一次(如初始化配置)核心方法:Do(f func()):保證 f只執行一次package mainimport ("fmt""sync" )var (config map[strin…

java整合itext pdf實現自定義PDF文件格式導出

springBoot結合itext pdf實現自定義PDF文件格式導出背景需求&#xff1a;使用PDF導出指定人員對應周次的打卡記錄&#xff0c;每周對應星期幾打卡過就打“√”。如下圖&#xff1a;1、導入依賴導入itextpdf依賴<!-- itex PDF --> <dependency><groupId>…

從0開始學習計算機視覺--Day07--神經網絡

當我們輸入的變量是一個比較大的向量&#xff08;比如有4096項&#xff09;&#xff0c;函數是求返回輸入的最大值&#xff0c;要求的權重矩陣的梯度就是4096 * 4096的大小&#xff0c;而實際上我們的輸入往往都不只有一個向量&#xff0c;那如果向量有一百個的話&#xff0c;是…

MySQL存儲過程全解析

1、存儲過程的概念 存儲過程是事先經過編譯并存儲在數據庫中的一段sql語句的集合&#xff0c;調用存儲過程可以簡化應用開發人員的很多工作&#xff0c;減少數據在數據庫和應用服務器之間的傳輸&#xff0c;對于提高數據處理效率是很有好處。 2、存儲過程的優點 存儲過程是通…

后端密碼加密:守護用戶數據的鋼鐵長城

&#x1f512;“系統被拖庫了&#xff01;” 這可能是開發者最恐懼的噩夢。而當用戶密碼以明文暴露時&#xff0c;災難將席卷每個用戶——密碼重用的慣性會讓黑客輕松攻破他們在其他平臺的賬戶。作為后端開發者&#xff0c;我們握有守護用戶安全的第一道鑰匙&#xff1a;科學的…

Flutter 3.29+使用isar構建失敗

執行命令&#xff1a;flutter build apk --release 報錯 Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!FAILURE: Build failed with an exception. …

SQL 轉 Java 實體類工具

拿到數據庫建表語句后怎么高效寫 Java 實體類&#xff1f;這款工具直接幫你全自動生成&#xff01; 作為一名后端 Java 工程師&#xff0c;你是不是也經歷過以下情況&#xff1a; ? 拿到一份完整的建表 SQL&#xff0c;卻要手動寫 Java Bean ? 字段幾十個&#xff0c;嵌套復…

創客匠人視角下:創始人 IP 打造與知識變現的深度耦合路徑

在知識經濟蓬勃發展的當下&#xff0c;創始人 IP 打造與知識變現的融合已成為行業破局關鍵。創客匠人作為深耕知識付費賽道多年的服務平臺&#xff0c;其創始人老蔣提出的 “土壤構建能力” 理論&#xff0c;為理解這一融合邏輯提供了獨特視角。從本質來看&#xff0c;創始人 I…

【網絡協議安全】任務13:ACL訪問控制列表

目錄 一、概念 1、前言 2、應用場景 3、ACL分類 基于ACL標識方法的劃分 基于對IPv4和IPv6支持情況的劃分 基于ACL規則定義方式的劃分 4、ACL的基本原理 ACL的組成 ACL的匹配機制 5、ACL常用匹配原則 6、ACL常用的匹配項 生效時間段 IP承載的協議類型 源/目的IP…

TensorFlow 安裝使用教程

一、TensorFlow 簡介 TensorFlow 是由 Google 開發的開源深度學習框架&#xff0c;支持數據流圖計算&#xff0c;可運行于 CPU/GPU/TPU。它被廣泛應用于語音識別、圖像處理、自然語言處理等多個 AI 領域。 二、安裝 TensorFlow 2.1 pip 安裝&#xff08;默認 CPU 版本&#x…

騰訊云認證考試報名 - TDSQL數據庫交付運維專家(TCCE MySQL版)

數據庫交付運維專家- 騰訊云TDSQL(MySQL版) 適合人群&#xff1a; 適合TDSQL(MySQL版)各組件擴縮容、運維、性能優化、故障解決、壓力測試等數據庫開發、運維、管理人員。 認證考試&#xff1a; 單選*40道多選*20道上機*20道 考試時長&#xff1a; 理論考試120分鐘,上機考試…

webUI平替應用,安裝簡單,功能齊全

前言 在安裝本地大模型后&#xff0c;我們都會為大模型安裝一個用戶界面&#xff0c;這樣就可以實現語音輸入&#xff0c;對話保存&#xff0c;微調&#xff0c;構建本地知識庫等高階功能。 目前最火的本地大模型UI&#xff0c;就是gihub上的webUI&#xff0c;但他不僅依賴較…

【Maven】Maven核心機制的 萬字 深度解析

Maven核心機制的萬字深度解析一、依賴管理機制全解&#xff08;工業級依賴治理方案&#xff09;1. 坐標體系的本質與設計哲學2. 依賴傳遞與仲裁算法的工程實現**沖突仲裁核心算法**企業級仲裁策略3. Scope作用域的類加載隔離原理4. 多級倉庫體系架構設計二、構建生命周期底層原…

暑期前端訓練day4

今天主要是有關周賽的&#xff0c;比賽的時候是用c寫的并且是 ak了&#xff0c;但是就是想用js再復盤一下&#xff0c;也不能只是圖一時之爽&#xff0c;如果是換在實際的場景里面我是不是只會用 c快速寫出來。 最近也要從js逐漸轉向ts&#xff0c;感覺Ts才是主旋律&#xff0c…

轉Go學習筆記(2)進階

前置&#xff1a;轉Go學習筆記1語法入門 目錄Golang進階groutine協程并發概念梳理創建goroutine語法channel實現goroutine之間通信channel與range、selectGoModulesGo Modules與GOPATHGo Modules模式用Go Modules初始化項目修改模塊的版本依賴關系Go Modules 版本號規范vendor …

無人機3控接力模式技術分析

一、運行方式 1. 接力控制流程 位置觸發切換&#xff1a;飛控中心實時監測無人機位置&#xff0c;當進入預設的切換路線&#xff08;如靠近下一個機庫或控制器覆蓋范圍&#xff09;時&#xff0c;觸發切換流程。 控制權請求與驗證&#xff1a; 當前控制器&#xff08…

Actor Critic對比PGValue-Based

目錄 回顧一下policy gradient&#xff1a; QAC算法&#xff1a; A2C- advantage actor critic 問題&#xff1a; 1. 為什么要結合起來&#xff0c;能解決什么問題&#xff1f; 1. 策略梯度 (PG) 的優勢與核心問題 2. 基于價值方法 (Value-Based) 的優勢與局限性 3. 潛…

buuctf-re

1.findKey 打開是C而且有點亂,所以找關鍵步驟有一個加密進去是不能反編譯的,有花指令, 這里有重復的部分把下面的NOP掉,重新定義函數’p’ 之后分析邏輯, // positive sp value has been detected, the output may be wrong! int __userpurge sub_40191F<eax>(int a1&l…

RuoYi、Vue CLI 和 uni-app 結合構建跨端全家桶方案

將 RuoYi、Vue CLI 和 uni-app 結合構建跨端全家桶方案&#xff0c;可以實現一套代碼管理后臺系統&#xff08;PC&#xff09;和移動端應用&#xff08;H5/小程序/App&#xff09;。以下是整合思路和關鍵步驟&#xff1a; 技術棧分工 RuoYi&#xff1a;后端框架&#xff08;Spr…