堆棧是C語言程序運行時必須的一個記錄調(diào)用路徑和參數(shù)的空間
????? -- 函數(shù)調(diào)用堆??蚣?/b>
????? -- 傳遞參數(shù)
????? -- 保存返回地址
????? -- 提供局部變量空間
* 函數(shù)的返回值默認使用 eax 寄存器存儲返回給上一級函數(shù)
了解堆棧存在的目的和編譯器對堆棧使用的規(guī)則是理解操作系統(tǒng)一些關(guān)鍵性代碼的基礎(chǔ)
堆棧寄存器
????? -- ebp 基址指針(base pointer),在C語言中用作記錄當前函數(shù)調(diào)用基址
????? -- esp 堆棧指針(stack pointer)
堆棧操作
????? -- push 棧頂?shù)刂窚p少4個字節(jié)(32位)
????? -- pop 棧頂?shù)刂吩黾?個字節(jié)(32位)
堆棧操作中涉及的其它關(guān)鍵寄存器
????? cs : eip? 總是指向下一條指令的地址
????? -- 順序執(zhí)行:總是指向地址連續(xù)的下一條指令
????? -- 跳轉(zhuǎn)/分支:執(zhí)行這樣的指令的時候,cs:eip的值會根據(jù)程序需要被修改
????? -- call:將當前cs:eip的值壓入棧頂,cs:eip指向被調(diào)用函數(shù)的入口地址
????? -- ret:從棧頂彈出原來保存在這里的cs:eip的值,放入cs:eip
????? -- 發(fā)生中斷時,CPU把寄存器的值壓到內(nèi)核堆棧里,eip指向中斷處理程序的入口地址
Stack memory + operations

Stack grows down
Use to implement procedure calls
(* 號表示eip寄存器不能被直接修改,只能通過特殊指令間接修改)
函數(shù)調(diào)用堆??蚣?/b>

call target
????? -- 執(zhí)行call之前
????? -- 執(zhí)行call時,cs:eip原來的值指向call下一條指令,該值被保存到棧頂,然后cs:eip的值指向target的入口地址
進入target(Prologue)
????? -- 第一條指令:pushl %ebp
????? -- 第二條指令:movl %esp, %ebp
????? -- 函數(shù)體中的常規(guī)操作,可能會壓棧、出棧
退出target(Epilogue)
????? -- 第一條指令:movl %ebp, %esp
????? -- 第二條指令:popl %ebp
????? -- ret
Gcc calling conventions

Saved %ebp’s form a chain, can walk stack
Arguments and locals at fixed offsets from EBP
通過反匯編一個簡單的C程序,分析匯編代碼理解C語言函數(shù)調(diào)用堆??蚣?br>
C程序

匯編代碼

觀察另一段小程序

觀察main中的局部變量

如何傳遞參數(shù)給p2

Q:p2的返回值是如何返回給main的?
觀察p2的堆棧框架

(完)
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當一個函數(shù)執(zhí)...
- 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學習匯編語言》系列視頻的筆記,在此感謝他和像他一樣...
- 首先寄存器使用慣例:eip :指令地址寄存器,保存程序計數(shù)器的值,當前執(zhí)行的指令的下一條指令的地址值,16位中為i...
- 從本篇開始,我們討論一些高級語言中的基礎(chǔ)設(shè)施:堆棧,函數(shù)調(diào)用,變量生命周期等等話題。因為這里本身會涉及到比較多的匯...
- 棧: 在函數(shù)調(diào)用時,第一個進棧的是主函數(shù)中函數(shù)調(diào)用后的下一條指令(函數(shù)調(diào)用語句的下一條可執(zhí)行語句)的地址,然后是函...