函式呼叫過程中棧幀的建立與銷毀

2021-09-30 14:42:03 字數 2048 閱讀 3975

開始之前需要對組合語言中的一些指令進行解釋:

esp    棧指標暫存器(extended stack pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂。

ebp    基址指標暫存器(extended base pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的底部。

mov    將「,」後面的 位址賦給「,」前面的。

push    push reg/mem/seg;sp

進棧指令先使堆疊指令sp減2,然後把乙個字運算元存入堆疊頂部。堆疊操作的物件只能是字運算元,進棧時底位元組存放於低位址,高位元組存放於高位址,sp相應向低位址移動兩個位元組單元。

pop    pop reg/seg/mem;reg/seg/mem

出棧指令把棧頂的乙個字傳送至指定的目的運算元,然後堆疊指標sp加2。目的運算元應為字運算元,字從棧頂彈出時,低位址位元組送低位元組,高位址位元組送高位元組。

sub             不帶借位的減法指令。指令格式:sub op1,op2   指令功能:(op1)←(op1)-(op2),將op1-op2的值,儲存在op1中,如:sub [eax],1 以eax暫存器為記憶體位址,將該位址的值減1,

rep stos

lea     edi,[ebp-0c0h]

mov     ecx,30h 

mov     eax,0cccccccch

rep stos dword ptr es:[edi]

rep指令的目的是重複其上面的指令.ecx的值是重複的次數. stos指令的作用是將eax中的值拷貝到es:edi指向的位址.

對乙個簡單的比較兩個個數最大值的函式進行分析:

開始逐行執行,並通過反彙編來檢視函式呼叫的原理:

呼叫開始的反彙編:

對形參進行例項化,通過指令實現:

當call指令執行時:

開始執行具體的操作:

push ebp       首先將esp指標下移,然後把ebp暫存器的內容(main函式的棧底位址)存到fun函式的當前棧頂(當前esp指向的位址);  

mov ebp, esp    把esp的內容賦給ebp;fun函式的棧底。

sub  esp,0d0h  給esp減去乙個隨機值,指向乙個新的fun函式棧頂。

從array中返回:

首先 將d的內容存在eax中;

之後進行返回操作:

mov   esp, ebp       把esp指向ebp的內容,形成新的棧頂

pop    ebp                 將棧頂的內容(main:ebp)彈出來放在ebp,把esp指標上移。

ret                把main:retaddr返回給pc ,esp上移;使pc指向main函式的下一 條指令;

add  esp,8    fun函式返回後a和b就會被釋放,所以這裡給esp加兩個整形的位元組,使esp恢復到形參例項化前的位置,即從棧向上兩個整形的位元組位元組

dword ptr [w],eax      將返回值賦值給主函式裡面的w;

函式的呼叫過程,棧幀的建立與銷毀

以下面一段 為例,說一說函式的呼叫過程,棧幀的建立與銷毀。這段 要在vc6.0下除錯,因為vc6.0對這部分的處理簡單些,利於學習使用。includeint add int x,int y int main 除錯以上 看呼叫堆疊視窗,我們可以看到main函式在 tmaincrtstartup函式中被...

函式的呼叫過程 棧幀的建立和銷毀

首先我們要了解一些概念。1.棧 stack 由編譯器自動分配釋放,存放為執行函式而分配的區域性變數 函式引數 返回函式 返回位址等。操作方式類似於資料結構中的棧。棧向下生成 先定義的位址高,後定義的位址低 2.堆 heap 由程式設計師分配釋放 若程式設計師不釋放,程式結束時可能由os 分配方式類似...

函式的呼叫過程,棧幀的建立和銷毀

我們大家學習c語言肯定都知道函式,但大家可能都只會用函式,對它的了解只是上層的,並不知道它的呼叫過程,今天我們就一起來深入的研究一下函式的呼叫過程。首先,我們要知道的是,在函式呼叫時,程式將使用乙個執行時堆疊,它裡邊存區域性變數和返回位址,執行時堆疊由ebp 存放維護這個棧的棧底指標 和esp 存放...