目錄
每一次函式呼叫都是乙個過程,為函式開闢棧空間,用於本次函式呼叫中臨時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.好處 函式過載...