如何处理这个异常? (零esp)

时间:2013-06-05 10:48:15

标签: c++ assembly

如何处理此异常?

__asm
{
  mov esp, 0
  mov eax, 0
  div eax
}

这不是由try/exceptSetUnhandledExceptionFilter()处理的。

2 个答案:

答案 0 :(得分:4)

假设这是在操作系统中运行,操作系统将捕获除以零,然后ATTEMPT以形成应用程序代码的异常/信号堆栈帧。但是,由于用户模式堆栈“坏”,它不能。

除了杀死应用程序之外,操作系统实际上没有办法处理这个问题。 [理论上,它可以从一些动态分配的内存组成一个新的堆栈,但它是毫无意义的,因为没有(总是工作)的方式让应用程序本身恢复到一个理智的状态]。

不要将堆栈指针设置为不是堆栈的东西 - 或者如果在堆栈指针寄存器中存储“随机”数据,则不要有异常。这与“不要用枪瞄准你的脚并拉动扳机,除非你想要没有你的脚”一样。

编辑:

如果代码在“内核模式”而不是“用户模式”下运行,那么它甚至会更“游戏结束”,因为它会“双重故障” - 处理器会遇到除以零的异常处理程序,它会尝试写入到堆栈,当它这样做时,它就会出错。这现在是“故障处理程序中的故障”,又称“双故障”。双故障处理程序的典型设置是具有单独的堆栈,然后恢复故障处理程序。但它仍然是游戏结束 - 我们不知道如何返回原始的错误处理程序[或如何找出原始错误处理程序是什么]。

如果没有带有双故障处理程序的“新堆栈”,它将使x86处理器出现三重故障 - 通常,三重故障将使处理器重新启动[技术上,它会通过一个特殊的位组合停止处理器地址总线表示它是“三重故障”。典型的PC北桥然后重置处理器,以识别三重故障是不可恢复的情况 - 这就是为什么有时你的PC只是在你的驱动器质量差的情况下重新启动]。

答案 1 :(得分:1)

尝试与嵌入式程序集中的高级语言异常机制进行交互并不是一个好主意。编译器可以执行无法匹配的“魔法”,并且没有(可移植的)方式告诉编译器“此汇编代码可能会引发异常”。