原始碼:
**基於esp 的棧幀**
** 基於ebp 的棧幀**
call 函式呼叫指令
格式: call oprd
功能: 過程呼叫指令
1. 其中oprd為過程的目的位址.
2. 過程呼叫可分為段內呼叫和段間呼叫兩種.定址方式也
可以分為直接定址和間接定址兩種.
3. 本指令不影響標誌位.
近呼叫 - 呼叫當前**段(cs 暫存器當前指向的段)中的過程,有時稱為段內呼叫。
執行近呼叫時,處理器將 eip 暫存器的值(包含 call 指令後面的指令的偏移量)壓入堆疊(稍後用作
返回指令指標)。然後,處理器分支到當前**段中由目標運算元指定的位址。目標運算元指定**段中的絕對偏移量
(即相對於**段基址的偏移量)或相對偏移量(相對於 eip 暫存器中指令指標的當前值的有符號位移量,此指標指向
call 指令後面的指令)。執行近呼叫時,cs 暫存器保持不變。
對於近呼叫,絕對偏移量在通用暫存器或記憶體位置(r/m16 或 r/m32)中間接指定。運算元大小屬性確
定目標運算元的大小(16 位或 32 位)。絕對偏移量直接載入到 eip 暫存器。如果運算元大小屬性是 16,
則 eip 暫存器的兩個高位位元組清除為零,得到大小最大為 16 位的指令指標。(使用堆疊指標 [esp] 作為基址
暫存器來間接訪問絕對偏移量時,使用的基址值是 esp 在指令執行之前的值)。
在彙編**中,相對偏移量(rel16 或 rel32)通常指定為標籤,但是在機器**級別,它的編碼形式
是有符號的 16 位或 32 位立即數。此值會加到 eip 暫存器中的值上。對於絕對偏移量,運算元大小屬性確定
目標運算元的大小(16 位或 32 位)
push ip,jmp ***;
遠呼叫 - 呼叫當前**段之外的段中的過程,有時稱為段間呼叫。
push cs,push ip,jmp ***;
ret 返回指令 引數與 return 不同
功能: 當呼叫的過程結束後實現從過程返回至原呼叫程式的下一條指令,
本指令不影響標誌位.
ret指令用棧中的資料修改ip的內容 實現近轉移
ip=ss*16+sp
sp=sp+2 相當於pop ip,jmp ip
ret指令用棧中的資料修改cs和ip的內容 實現遠轉移
ip=ss*16+sp
sp=sp+2
cs=ss*16+sp
sp=sp+2
相當於pop ip,pop cs,jmp cs:ip
ret指令可以帶有乙個立即數i16 則堆疊指標sp將增加
**進入函式前**
PowerPC棧幀理解
因為實驗室專案的原因,才開始接觸powerpc,錯誤的地方還望看到的各位指正。上面就是ibm的手冊上面畫的棧幀,他的文字描述也符合這個示意圖,理解起來就是棧頂存放的是上乙個棧的棧頂的位址。r1暫存器 一般作為預設的堆疊指標 存放自身的棧頂。因為沒有push和pop指令,所以是通過stwu和lwzu來...
深入理解C 函式棧幀
目錄 每一次函式呼叫都是乙個過程,為函式開闢棧空間,用於本次函式呼叫中臨時gyoosgl變數的儲存 現場保護。這塊棧空間我們稱為函式棧幀。棧是從高位址向低位址延伸的。暫存器ebp指向當前的棧幀的底部 高位址 暫存器esp指向當前的棧幀的頂部 低位址 注 esp 棧指標暫存器 extended sta...
程式棧 棧幀
乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 棧區 stack 由編譯器自動分配釋放 存放函式的引數名,區域性變數的名等。其操作方式類似於資料結構中的棧。堆區 heap 由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。靜...