【发布时间】:2012-09-04 07:01:54
【问题描述】:
如何从调用堆栈中获取地址?我正在编写一个异常处理程序,我想让它显示 CPU 异常是否发生?
【问题讨论】:
标签: exception assembly x86 interrupt
如何从调用堆栈中获取地址?我正在编写一个异常处理程序,我想让它显示 CPU 异常是否发生?
【问题讨论】:
标签: exception assembly x86 interrupt
从 intel.com 或 amd.com 获取一份 CPU 手册。查看有关中断和异常处理的章节。找到显示中断或异常发生时堆栈内容的图表。例如,来自 INTEL 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 之前将其弹出),然后是 @987654323 @ 和cs 导致异常或被中断的位置。
【讨论】: