Win32 EXCEPTION_INT_OVERFLOW与EXCEPTION_INT_DIVIDE_BY_ZERO

Sco*_*ski 10 windows x86 assembly exception

我有关于EXCEPTION_INT_OVERFLOW和EXCEPTION_INT_DIVIDE_BY_ZERO异常的问题.

Windows将捕获由IDIV指令生成的#DE错误,并最终使用这两个代码之一生成SEH异常.

我的问题是它如何区分这两个条件?英特尔手册中有关idiv的信息表明它将在"除以零"和"下溢情况"中生成#DE.

我快速浏览了intel手册第3卷中#DE错误的部分,我能收集的最好的是操作系统必须解码DIV指令,加载除数参数,然后将其与零进行比较.

这对我来说似乎有点疯狂.为什么芯片设计者不会使用某种标志来区分错误的两个原因?我觉得我必须遗漏一些东西.

有谁知道操作系统如何区分两种不同的故障原因?

Zoo*_*oba 6

你的假设似乎是正确的.#DE上唯一可用的信息是CS和EIP,它提供指令.由于两个状态代码不同,OS必须解码指令以确定哪个.

我还建议芯片制造商在这种情况下不需要两个单独的中断,因为任何除以零的都是无穷大,这太大而不适合你的目标寄存器.

至于"肯定地知道"它是如何区分的,所有知道的人都可能不被允许透露它,要么阻止人们利用它(不完全确定如何,但跳进内核模式是一个开始寻找的好地方利用)或根据可能在不另行通知的情况下更改的实施细节做出假设.


编辑:玩过kd后我至少可以说在我可以访问的特定版本的Windows XP(32位)(以及它运行的处理器)上,nt!Ki386CheckDivideByZeroTrap中断处理程序似乎将指令的ModRM值解码为确定是否返回STATUS_INTEGER_DIVIDE_BY_ZEROSTATUS_INTEGER_OVERFLOW.

(显然这是原始研究,任何地方的任何人都不能保证,并且恰好匹配可以根据英特尔手册进行的扣除.)