1. 程式人生 > >C語言--函數的調用調用過程,棧幀的創建和銷毀。

C語言--函數的調用調用過程,棧幀的創建和銷毀。

調用函數 棧頂指針 第一個 可執行 創建 執行 過程 臨時變量 變量

函數在內存中到底是怎麽經過一系列過程調用的呢? 指針寄存器esp,ebp
1. 首先先搞清楚函數調用中兩個非常重要的指針寄存器esp,ebp。對這兩個寄存器的一些理解:
esp為棧指針,用於指向棧的棧頂
ebp為幀指針,指向棧的棧底。 函數棧幀
2. 函數調用過程中需要開辟空間,用於本次函數的調用中臨時變量的保存、現場保護。這塊棧空間 我們稱之為函數棧幀。
棧空間由高地址向低地址使用。 函數調用過程

當函數被調用的時候,執行如下操作:

1.將幀指針壓入棧中: push ebp
2.用ebp保存當前棧指針:mov ebp ,esp
3.棧指針自減,得到的內存被用來存儲被調用函數的本地狀態:sub esp ,4Ch
4.在函數調用時,第一個進棧的是被調用函數後的下一條指令的地址(函數調用語句的下一條可執行語句即call指令下一條指令的地址)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,先壓形參b在壓形參a ,然後是函數中的局部變量。註意靜態變量是不入棧的。
5.函數調用完成時,局部變量先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中下一條指令,程序由該點繼續運行。

C語言--函數的調用調用過程,棧幀的創建和銷毀。