x86 32位保护模式:从调用堆栈读取?

时间:2012-09-04 07:01:54

标签: exception assembly x86 interrupt

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

1 个答案:

答案 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导致异常或已被中断的位置。