函式呼叫棧禎

2021-07-22 11:39:31 字數 966 閱讀 2062

函式呼叫另乙個詞語叫過程,乙個過程呼叫包括將資料和控制從**的一部分傳遞到另一部分。另外,它還必須在進入時為過程的區域性變數分配空間,並在退出時釋放這些空間。而資料傳遞,區域性變數的分配和釋放通過操縱程式棧來實現。

在了解函式呼叫棧禎之前首先得清楚程式對記憶體是如何使用的?

堆和棧

程式對記憶體的使用主要分為幾個區:

**段:儲存程式的二進位制**

資料段:儲存初始化的全域性變數和static量

bss段:未初始化的全域性變數

堆(heap):一般由程式設計師動態分配和釋放的記憶體,位址向上增長

棧(stack):編譯器自動分配和釋放,存放函式的引數值,區域性變數的值等

堆疊 往上就是    命令列引數和環境變數

如圖:

那麼現在,我們在說說什麼是棧禎?

棧幀(stack frame),機器用棧來傳遞過程引數,儲存返回資訊,儲存暫存器用於以後恢復,以及本地儲存。為單個過程(函式呼叫)分配的那部分棧稱為棧幀。棧幀其實是兩個指標暫存器,暫存器%ebp為幀指標,而暫存器%esp為棧指標,當程式執行時,棧指標可以移動(大多數的資訊的訪問都是通過幀指標的)。總之簡單一句話,棧幀的主要作用是用來控制和儲存乙個過程的所有資訊的。棧幀結構如下所示:

如果你都能完全看懂了,那就不必要繼續看下面了。next-->

下面都會用**解釋剛才的呼叫過程:

參考:

函式呼叫棧

當程式進行函式呼叫的時候,系統會用到下面三種暫存器 3.ebp ebp暫存器裡儲存的是棧基址,是在函式呼叫之前,由esp賦值給ebp的。棧底方向,高位位址 call fun arg1,arg2,arg3 修改esp,棧向下增長,引數入棧,返回位址入棧 arg3 arg2 arg1 返回位址 上一層e...

棧 函式呼叫

編譯以下程式,分析此程式以得出棧的精髓 1 主函式被上層呼叫者呼叫後,執行push ebp,esp 4 因為ebp入棧 ebp值沒有改變,值得注意的是剛開始分配站的時候,第乙個入棧的是return,主函式的返回位址,然後是ebp 2 然後是mov ebp,esp,將esp的值賦給ebp,該語句未執行...

函式呼叫 函式棧

函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的 最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢?對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為 段,資料段,堆,棧 段 儲存程式文字,指令指標eip...