c++ - 如何处理这个异常? (零特别是)

标签 c++ assembly

如何处理这个异常?

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

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

最佳答案

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

除了杀死应用程序之外,操作系统真的没有办法处理这个问题。 [从理论上讲,可以从一些动态分配的内存中组成一个新堆栈,但这毫无意义,因为没有(始终有效的)应用程序本身可以恢复到正常状态的方法]。

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

编辑:

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

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

关于c++ - 如何处理这个异常? (零特别是),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16937932/

相关文章:

c++ - FastFeatureDetector opencv C++ 过滤结果

assembly - 如何在 x86 程序集中设置或清除溢出标志?

汇编保留寄存器值?

assembly - 键盘箭头的扫描码是什么? (右,左,下,上)

winapi - 在 win32 上使用 MASM 组装的程序没有控制台输出

c - 如何将头文件函数中的内联程序集转换为不支持 x64 的程序集的 c++ 函数?

c++ - 继承包含另一个派生类的 C++ 类

C++定义虚基类重载运算符

c++ - c 和 c++ 中二维数组元素的类型是什么?

c++ - 指针 vector ,继承