IDA棧幀相關理解

2021-09-20 06:49:49 字數 1820 閱讀 8395

原始碼:

**基於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 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。靜...