来自:http://software.intel.com/en-us/articles/introduction-to-pc-architecture/
异常编号10h对应于“浮点错误”,但软件中断10h也对应于“视频支持”BIOS中断(两者都处于实模式)。
我遗漏了什么?
发布于 2009-10-28 10:05:45
你不会错过任何东西的。
8088处理器(最初的IBM PC中使用的处理器)仅定义了例外0、1、2、3和4。
因此,IBM将0x8到0xF用于硬件中断处理程序,将0x10或更高版本用于BIOS例程。由于某种原因,IBM忽略了一个事实,即Intel非常明确地保留了数字0x5到0x1F,以备将来处理器例外使用。
随着时间的推移,需要更多的例外,英特尔继续进行分配。大多数时候,遗留软件无论如何都不会触发这些异常,而较新的操作系统(在保护模式下运行的操作系统)可以分配不同的编号,以避免与处理器异常发生冲突。
有大量的黑客添加到旧的软件,以获得一些使用新的处理器功能,而不会破坏太多的兼容性。虽然我不确定,但我怀疑可能是较新的BIOSes试图检测INT10是由软件中断还是由其INT10处理程序中的协处理器触发的。
仅供参考,摘自386程序员手册:
协处理器错误向量至中断16。任何具有协处理器的80386系统必须将中断向量16用于协处理器错误异常。如果8086/8088系统为8087中断使用另一个向量,则两个向量都应该指向协处理器错误异常处理程序。
发布于 2009-10-28 10:06:31
好的,看一下here, on Watcom's site。这是我认为最重要的部分,尽管关于8087的旧笔记也很有趣。
由于绝大多数PC用户仍在运行PC并需要与IBM兼容的市场现实,IBM处理数学错误的方式并不直接。由于IBM在设计PC时忽略了Intel的建议,286的数学错误或中断16与BIOS视频服务中断10h (十进制16)冲突。最重要的是,现有的软件期望数学异常通过int2到达。
IBM AT没有连接CPU和FPU错误引脚,而是使用主板电路将287错误信号路由到级联的第二个8259A PIC,并使用IRQ 13向CPU发送数学错误信号。默认BIOS IRQ 13处理程序(即INT 75h向量-请记住,IRQ 8,第二个PIC的第一个IRQ线路对应于中断向量70h)包含调用INT 2的代码,以与现有软件兼容。因此,AT上的软件仍然可以挂钩NMI矢量并在PC或AT上不加改变地运行。
当287断言其错误信号时,IBM AT中的外部电路驱动286的忙输入引脚激活。这阻止了进一步的FPU指令的执行,并且需要避免在287发出错误信号之后和286开始处理产生的中断之前的时间窗口中出现问题。
发布于 2010-08-30 08:06:40
简单的答案是,int 10h浮点错误是保护模式异常,而int 10h视频服务是实模式中断。
令人满意的答案是,清除CR0寄存器中的NE位将防止异常发生,并允许它在PM32中作为简单中断使用(例如,在32位保护模式BIOS扩展器中)。
https://stackoverflow.com/questions/1634680
复制相似问题