自: http://software.intel.com/en-us/articles/introduction-to-pc-architecture/
异常编号10h对应“浮点错误”,但软件中断10h也对应“视频支持”BIOS中断(均为实模式)。
我错过了什么?
答案 0 :(得分:6)
你没有遗漏任何东西。
8088处理器(原始IBM PC中使用的处理器)仅定义了例外0,1,2,3和4.
因此IBM对硬件中断处理程序使用0x8至0xF,对BIOS程序使用0x10及以上。出于某种原因,IBM忽略了英特尔非常清楚保留数字0x5到0x1F以便将来处理器异常的事实。
随着时间的推移,需要更多例外,英特尔继续分配它们。大多数情况下,遗留软件无论如何都不会触发这些异常,而较新的操作系统(以受保护模式运行的系统)可以分配不同的数字,以免与处理器异常冲突。
旧软件中添加了大量黑客,可以在不破坏太多兼容性的情况下使用更新的处理器功能。虽然我不确定,但我怀疑可能更新的BIOS可能试图检测INT10是由软件中断还是由INT10处理程序中的协处理器触发的。
仅供参考,来自386程序员手册:
协处理器错误导致中断16.任何具有协处理器的80386系统必须使用中断向量16来处理协处理器错误异常。如果8086/8088系统使用另一个向量进行8087中断,则两个向量都应指向协处理器错误异常处理程序。
答案 1 :(得分:3)
好的,看看here, on Watcom's site。这是我认为的重要部分,尽管关于8087的旧注释也很有趣。
由于市场现实的广阔 大多数PC用户仍在运行PC DOS并要求IBM PC 兼容性,IBM AT的方式 处理数学错误不是 直截了当。因为IBM忽视了 英特尔在设计时的建议 PC,286的数学故障或中断 16与BIOS视频服务冲突 中断10h(十进制16)。在之上 那,现有的软件预期数学 通过INT 2到达的例外情况。而不是连接CPU和FPU ERROR引脚,IBM AT使用 主板电路路由287 ERROR信号到级联秒 8259A PIC并使用IRQ 13发出信号 数学错误到CPU。默认 BIOS IRQ 13处理程序(即INT 75h 矢量 - 记住IRQ 8, 第二个PIC的第一个IRQ线, 对应中断向量70h) 包含调用INT 2的代码 与现有软件的兼容性。 因此,AT上的软件仍然可以挂钩 NMI向量并保持不变 PC或AT。
IBM AT中的外部电路 驱动286的BUSY输入引脚有效 当287断言其ERROR信号时。 这可以防止执行进一步的FPU 说明并要求避免 在时间窗口之后的问题 287表示错误,之前是 时间286开始处理 结果中断。
答案 2 :(得分:2)
浮点故障是由错误条件生成的CPU中断。这与IRQ不同。
PIC(可编程中断控制器)可用于修改哪些IRQ将映射到哪个CPU中断。如果以适当的顺序发送PIC的IO端口(使用OUT
指令),则可以映射IRQ,使其不会因浮点异常而与CPU中断冲突。
编辑:但现在我再次阅读你的问题......我们不是在谈论IRQ。 BIOS Int 10h是一个完全不同的野兽...这是你的BIOS为视频例程实现的一些代码。如果您正在编写操作系统并想知道是否应该处理浮点故障,那么您应该忘记存在这种特定的BIOS中断。 : - )
编辑2:想想看,可能老DOS程序解决这个问题的方法是备份IVT条目,将自己的异常处理程序放在其位置,做一些浮点运算,并在恢复旧的IVT条目时他们完成了FPU。答案 3 :(得分:0)
简单的答案是int 10h
浮点错误是受保护模式的异常,而int 10h
BIOS视频服务是实模式中断。
快乐的答案是清除NE
寄存器中的CR0
位将阻止异常发生并允许它在PM32中用作简单中断(例如32位保护模式BIOS扩展程序)。