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指令,加载除数参数,然后将其与零进行比较.
这对我来说似乎有点疯狂.为什么芯片设计者不会使用某种标志来区分错误的两个原因?我觉得我必须遗漏一些东西.
有谁知道操作系统如何区分两种不同的故障原因?
你的假设似乎是正确的.#DE上唯一可用的信息是CS和EIP,它提供指令.由于两个状态代码不同,OS必须解码指令以确定哪个.
我还建议芯片制造商在这种情况下不需要两个单独的中断,因为任何除以零的都是无穷大,这太大而不适合你的目标寄存器.
至于"肯定地知道"它是如何区分的,所有知道的人都可能不被允许透露它,要么阻止人们利用它(不完全确定如何,但跳进内核模式是一个开始寻找的好地方利用)或根据可能在不另行通知的情况下更改的实施细节做出假设.
编辑:玩过kd后我至少可以说在我可以访问的特定版本的Windows XP(32位)(以及它运行的处理器)上,nt!Ki386CheckDivideByZeroTrap中断处理程序似乎将指令的ModRM值解码为确定是否返回STATUS_INTEGER_DIVIDE_BY_ZERO或STATUS_INTEGER_OVERFLOW.
(显然这是原始研究,任何地方的任何人都不能保证,并且恰好匹配可以根据英特尔手册进行的扣除.)
| 归档时间: |
|
| 查看次数: |
1322 次 |
| 最近记录: |