我正在創建一個顯示名為 dumpRegisters 的暫存器的程式。暫存器需要與除錯器的 Registers 視窗中顯示的內容相匹配(使用 Visual Studio)。除錯器視窗中的暫存器有:EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP、EIP、EFL。總共10個暫存器。
我知道 Irvine Library 已經有了這個程式,但我是從頭開始創建的。
我可以顯示大部分暫存器。但是,我正在為如何顯示 ESP(擴展堆疊指標)暫存器而苦苦掙扎?
我在整個程式中都使用 push 和 pop,所以當我呼叫 showRegister 程序時,它會在那個時候輸出 ESP,但是 ESP 會繼續變化,所以當程式退出時,我顯示的 ESP 是不一樣的。我嘗試推送和彈出 esp,但是,根據我推送和彈出 esp 的位置,它仍然不匹配,有時它也只顯示前 4 個暫存器。
如何讓 ESP 暫存器與除錯器中的暫存器視窗匹配?
dumpRegisters PROC
push eax
push edx
mov edx, OFFSET essp
mov eax, esp
INVOKE showRegister, OFFSET essp, esp
pop edx
pop eax
dumpRegisters ENDP
showRegister PROC,
regName:PTR BYTE , regValue:DWORD
;push esp
call writeString
call writeHex
Tab
;pop esp
ret
showRegister ENDP
uj5u.com熱心網友回復:
在列印或保存其他傳入引數之后,計算在推送 4 位元組回傳地址的(錯字?)之前必須有什么 ESP ,再加上你所做的任何其他推送。call dumpRegsiters
lea eax, [esp 12]2 次推動后應該是正確的。
您可能應該先從 a 開始pushf保存 EFLAGS,這樣您就可以使用修改 FLAGS 的指令,例如add或sub。然后當然相應地調整您的偏移量。除非事實證明 Irvine32 函式像 WriteHex 本身保存/恢復 EFLAGS,否則您可能只是在處理傳入的資料。
pusha如果您不需要列印帶有值的暫存器名稱,您甚至可以從彈出和列印開始并回圈。該指令的少數用例之一,盡管您仍然可能想要計算 ESP 而不是使用它推送的內容。
(如果您不介意在呼叫后獲得地址,我想從您的回傳地址中獲取 EIP 。如果您想要之前的地址,則必須弄清楚它是 5-bytecall rel32還是通過函式呼叫像 2 位元組這樣的指標call eax。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/479742.html
上一篇:為什么clang使Quake快速反平方根代碼比使用GCC快10倍?(帶有*(long*)float型別雙關語)
下一篇:如何為他們開發的語言實作標準庫?
