0
如何從調用堆棧中獲取地址?我正在編寫一個異常處理程序,我想讓它顯示CPU異常發生了嗎?x86 32位保護模式:從調用堆棧讀取?
如何從調用堆棧中獲取地址?我正在編寫一個異常處理程序,我想讓它顯示CPU異常發生了嗎?x86 32位保護模式:從調用堆棧讀取?
從intel.com或amd.com獲得一份CPU手冊的副本。查閱有關中斷和異常處理的章節。發生中斷或異常時,查找顯示堆棧內容的圖表。例如,來自英特爾公司的80386程序員參考手冊1986:
Figure 9-5. Stack Layout after Exception of Interrupt
WITHOUT PRIVILEGE TRANSITION
D O 31 0 31 0
I F ╠═══════╦═══════╣ ╠═══════╦═══════╣
R ║▒▒▒▒▒▒▒║▒▒▒▒▒▒▒║ OLD ║▒▒▒▒▒▒▒║▒▒▒▒▒▒▒║ OLD
E E ╠═══════╬═══════╣ SS:ESP ╠═══════╬═══════╣ SS:ESP
C X ║▒▒▒▒▒▒▒║▒▒▒▒▒▒▒║ │ ║▒▒▒▒▒▒▒║▒▒▒▒▒▒▒║ │
T P ╠═══════╩═══════╣<────┘ ╠═══════╩═══════╣<────┘
I A ║ OLD EFLAGS ║ ║ OLD EFLAGS ║
O N ╠═══════╦═══════╣ ╠═══════╦═══════╣
N S ║▒▒▒▒▒▒▒║OLD CS ║ NEW ║▒▒▒▒▒▒▒║OLD CS ║
I ╠═══════╩═══════╣ SS:ESP ╠═══════╩═══════╣
│ O ║ OLD EIP ║ │ ║ OLD EIP ║ NEW
│ N ╠═══════════════╣<────┘ ╠═══════════════╣ SS:ESP
│ ║ ║ ║ ERROR CODE ║ │
v ╠═══════════════╣<────┘
║ ║
WITHOUT ERROR CODE WITH ERROR CODE
那麼,它就在那裏,你的中斷處理程序接收堆棧中的最後的事情是錯誤代碼(可選;不是所有的異常都有它,你會需要在執行iret
之前將其彈出),然後eip
和cs
引起異常或已被中斷的位置。
謝謝!這正是我所尋找的(我仍然是一個asm noob,大聲笑) – user1454902