如何处理这个异常?
__asm
{
mov esp, 0
mov eax, 0
div eax
}
这不是用try/except
or处理的SetUnhandledExceptionFilter()
。
假设这是在操作系统中运行,操作系统将捕获除以零,然后尝试为应用程序代码形成异常/信号堆栈帧。但是,由于用户模式堆栈是“坏的”,它不能。
操作系统真的没有办法处理这个问题,除了杀死应用程序。[理论上,可以从一些动态分配的内存中组成一个新的堆栈,但这毫无意义,因为应用程序本身没有(总是有效的)方法可以恢复到正常状态]。
不要将堆栈指针设置为不是堆栈的东西 - 或者如果您确实将“随机”数据存储在堆栈指针寄存器中,则不要出现异常。这与“不要将枪对准你的脚并扣动扳机,除非你想没有你的脚”是一样的。
编辑:
如果代码在“内核模式”而不是“用户模式”下运行,它甚至更“游戏结束”,因为它会“双重故障”——处理器遇到除以零异常处理程序,它试图写入堆栈,当它这样做时,它会出错。这现在是“故障处理程序中的故障”,也就是“双重故障”。双故障处理程序的典型设置是有一个单独的堆栈,然后恢复故障处理程序。但这仍然是游戏结束 - 我们不知道如何返回原始故障处理程序[或如何找出原始故障处理程序是什么]。
如果没有带有双重故障处理程序的“新堆栈”,它将对 x86 处理器产生三重故障 - 通常,三重故障将使处理器重新启动[从技术上讲,它使用地址总线上发出的特殊位组合来暂停处理器表示这是“三重故障”。然后,典型的 PC 北桥会重置处理器,以识别三重故障是一种不可恢复的情况 - 这就是为什么有时当您的驱动程序质量较差时您的 PC 只是重新启动]。
尝试通过嵌入式汇编与高级语言的异常机制进行交互并不是一个好主意。编译器可以做你无法匹配的“魔术”,并且没有(可移植的)方法告诉编译器“这个汇编代码可能会抛出异常”。