如何从调用堆栈中获取地址?我正在写一个异常处理程序,我想让它显示是否发生了CPU异常?
答案 0 :(得分:1)
从intel.com或amd.com获取CPU手册的副本。查看有关中断和异常处理的章节。发现中断或异常时,查找显示堆栈内容的图表。例如,来自INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 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
之前将其弹出),然后<{1}}和eip
导致异常或已被中断的位置。