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

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

永遠 rep 底部 pop mov call mage 繼續 TP

一.函數調用

1.函數調用過程涉及到的寄存器:
(1)esp:棧指針寄存器(extended stack pointer),其內存放著一個指針,該指針永遠指向系統棧最上面一個棧幀的棧頂。
(2)ebp:基址指針寄存器(extended base pointer),其內存放著一個指針,該指針永遠指向系統棧最上面一個棧幀的底部。
(3)eax 是”累加器”(accumulator), 它是很多加法乘法指令的缺省寄存器。
(4)ebx 是”基地址”(base)寄存器, 在內存尋址時存放基地址。
(5)ecx 是計數器(counter), 是重復(REP)前綴指令和LOOP指令的內定計數器。
(6)edx 則總是被用來放整數除法產生的余數。
(7)esi/edi分別叫做”源/目標索引寄存器”(source/destination index),因為在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目標串.
在32位平臺上,ESP每次減少4字節。

2.簡單的匯編指令:
mov :數據傳送指令,也是最基本的編程指令,用於將一個數據從源地址傳送到目標地址(寄存器間的數據傳送本質上也是一樣的)
sub:減法指令
lea:取偏移地址
push:實現壓入操作的指令是PUSH指令
pop:實現彈出操作的指令

call:用於保存當前指令的下一條指令並跳轉到目標函數。

3.內存地址空間的分布:

技術分享圖片

函數調用總結起來整個過程就三步:
1)根據調用的函數名找到函數入口;
2)在棧中審請調用函數中的參數及函數體內定義的變量的內存空間
3)函數執行完後,釋放函數在棧中的審請的參數和變量的空間,最後返回值(如果有的話)
如果你學了微機原理,你會想到cpu中斷處理過程,是的,函數調用過程和中斷處理過程一模一樣。

二.棧的創建及銷毀

1.棧幀(stack frame),機器用棧來傳遞過程參數,存儲返回信息,保存寄存器用於以後恢復,以及本地存儲。為單個過程(函數調用)分配的那部分棧稱為棧幀。棧幀其實是兩個指針寄存器,寄存器%ebp為幀指針,而寄存器%esp為棧指針,當程序運行時,棧指針可以移動(大多數的信息的訪問都是通過幀指針的)。總之簡單一句話,棧幀的主要作用是用來控制和保存一個過程的所有信息的。如圖為棧的結構及調用過程:

技術分享圖片

假設過程P(調用者)調用過程Q(被調用者),則Q的參數放在P的棧幀中。另外,當P調用Q時,P中的返回地址被壓入棧中,形成P的棧幀的末尾(返回地址就是當程序從Q返回時應該繼續執行的地方)。Q的棧幀從保存的幀指針的值開始,後面到新的棧指針之間就是該過程的部分了。

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