0

如何从调用堆栈中获取地址?我正在编写一个异常处理程序,我想让它显示 CPU 异常是否发生?

4

1 回答 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 回答