深入理解C 函式棧幀

2022-09-25 01:09:10 字數 1089 閱讀 8125

目錄

每一次函式呼叫都是乙個過程,為函式開闢棧空間,用於本次函式呼叫中臨時gyoosgl變數的儲存、現場保護。這塊棧空間我們稱為函式棧幀。棧是從高位址向低位址延伸的。暫存器ebp指向當前的棧幀的底部(高位址),暫存器esp指向當前的棧幀的頂部(低位址)

注:esp:棧指標暫存器(extended stack pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂。

bsp:基址指標暫存器(extended base pointer),其內存放著乙個指標,該指www.cppcns.com針永遠指向系統棧最上面乙個棧幀的底部。

入棧push和出棧pop

push ebp就等於將ebp的值儲存到棧中,並且將當前esp下移

pop ebp就等於將ebp的值從棧中取出來,將ebp指向這個值

記憶體空間大致可以用下圖表示:

我們來通過執行程式來分析,有如下程式

int sum(int _a, int _b)

int main()

使用vs2017除錯,檢視反彙編

main在呼叫之前如圖:

sum函式在呼叫之前

sum函式內的記憶體分布

在上述的彙編碼中我們可以看到在函式開始的時候,習慣上以這麼l兩段**開始

push ebp

mov ebp,esp

按照字面上理解,上面兩句話的意思是將ebp推入棧中,之後讓ebp等於esp

在函式呼叫之前,將呼叫者的函式(caller)的ebp存入棧,以便於在執行完畢後恢復現場;

下一步,sum函式必須為它的區域性變數分配空間,同時,也必須為它可能用到的一些臨時變數分配空間;

sub esp, 0cch; // 減去的值根據程式而定;

之後會根據情況看是否儲存某些特定的暫存器(ebx,esi和edi);

而ebp的值會保持固定,區域性變數和臨時儲存則都可以通過基準指標ebp加偏移量找到;

在函式執行完畢,控制流返回到呼叫者的函式(caller)之前會進行下述操作

所謂有始有終,這是會還原上面儲存的暫存器值,之後還原esp的值(上乙個函式呼叫之前的esp被儲存在固定的ebp中)與ebp值。這一過程被稱為還原現場之後通過ret返回上乙個函式。

深入理解函式

第五章 深入理解函式 1.return語句 有返回值的函式中,return語句的作用式提供整個函式的返回值,並結束當前函式返回到呼叫它的地方。在沒有返回值的函式中也可以使用return語句,例如當前檢查到乙個錯誤時提前結束當前函式的執行並返回 這個函式首先檢查引數x是否大於0,如果x不大於0就列印錯...

C 類函式深入理解

先看一段 class a void print const int main int argc,const char argv 執行結果 a print 0x100000eb0 print enter.this 0x0 a v 1 空指標 那麼問題來了。一般情況下,a null,為空指標,訪問a都是...

深入理解C 過載函式

深入理解c 過載函式 1.定義 c 允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數 指引數的個數 型別或者順序 必須不同,即函式的引數列表不同,也就是說用同乙個運算子完成不同的運算功能。這就是過載函式。過載函式常用來實現功能類似而所處理的資料型別不同的問題。2.好處 函式過載...