函式就是一系列c語句的集合,為了完成某個會重複使用的特定功能。
需要該功能的時候,直接呼叫該函式即可,不用每次都堆疊一大堆的**;
需要修改該功能的時候,也只要修改和維護這乙個函式即可。
總之,將語句集合成函式,好處就是方便**重用。並且,乙個好的函式名,
可以讓人一眼就知道這個函式實現的是什麼功能,方便維護。
##函式的呼叫過程
那我們深入的研究一下函式的呼叫過程
先看看下面這段**,當我們進行除錯的時候,檢視【呼叫堆疊】
-檢視呼叫堆疊,我們可以發現其實 main 函式在_tmaincrtstartup 函式中 呼叫的,而_tmaincrtstartup函式在 maincrtstartup 被呼叫的
- 每一次函式呼叫都是乙個過程,通常稱為:【函式的呼叫過程】
- 函式要跑起來的話,它要向記憶體申請一段空間;而這段空間在棧上開闢,那麼這塊
棧空間我們稱之為【函式棧幀】;記住棧的使用順序是由高位址到低位址。
- 我們平時知道的暫存器有eax,ebx,ecx,edx;
- 還有兩個ebp和esp,在函式呼叫的過程中這兩個暫存器存放了維護這個棧的
棧底和棧頂指標。來維護開闢出這段位址的起始和結尾的記憶體位址。
######呼叫main函式,我們要為main函式分配棧幀空間,棧幀維護如下:
######ebp指向了函式棧幀棧底的位址;esp指向了函式棧幀棧頂的位址。
當我們要詳細的研究函式呼叫過程,必須得對應彙編**。
從main函式開始,要展開main函式的呼叫就得為main函式建立棧幀。
那我們先來看main函式棧幀的建立;
接下來是add函式的呼叫。引數傳遞過程:
執行call指令的時候按f11,來到了這裡
再按f11就進入add函式的執行**處
剩下的是函式返回部分
棧幀這部分內容在不同的編譯器上實現存在差異,但是思想是一致的
函式呼叫過程(棧幀)
眾所周知,程式每呼叫乙個函式,系統都會為其開闢一塊空間,當它返回時,才收回這塊空間。程式崩潰有一部分原因就是因為無限制的呼叫函式,卻沒有及時返回,導致記憶體空間不夠。為了更好的維護這一塊空間 通常稱為棧空間 我們需要了解兩個暫存器,乙個為 esp 指向棧頂的指標 乙個為 ebp 指向棧底的指標 棧空...
函式棧幀(呼叫過程)
函式棧幀就是在呼叫函式是為其在棧空間上開闢了一段空間,指向過程呼叫,乙個過程呼叫包括將資料 以過程引數和返回值的形式 和控制從 的一部分傳遞到另一部分。我們以以下 為例講解整個函式呼叫過程 int my add int x,int y int main 一 呼叫main 函式 我們從main 函式的...
函式的呼叫過程 棧幀
在談棧幀之前,我們必須要先知道c c 程式記憶體的分配情況。乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放為執行函式而分配的局 部變數 函式引數 返回資料 返回位址等。其操作方式類似於資料結構中的 棧。2 堆區 heap 一般由程式設計師分配釋...