如何从调用堆栈中获取地址?我正在编写一个异常处理程序,我想让它显示 CPU 异常是否发生?
问问题
176 次
1 回答
1
从 intel.com 或 amd.com 获取一份 CPU 手册。查看有关中断和异常处理的章节。找到显示中断或异常发生时堆栈内容的图表。例如,来自 1986 年的 INTEL 80386 程序员参考手册:
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
的位置异常或已被中断。
于 2012-09-04T07:53:56.457 回答