🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 2.6 中断和异常 80386有两种手段来中断程序的执行: 1.异常是同步事件,当CPU在指令执行期间检测到某些条件时作出的反映。 2.中断是异步事件,通常由需要引起注意的外部设备触发。 中断和异常有一点是相同的:它们都需要CPU暂停正在执行的程序,转去执行更高优先级的程序。这两种中断的主要区别在于它们的发生源。异常在重新执行引起异常的程序和数据时总能复现,而中断通常独立于当前正在执行的程序。 正常情况下,应用程序不关心中断的处理。系统程序员可以在第9章找到更多中断的信息。然而,应用程序员对有些异常更感兴趣,许多操作系统给予了应用程序处理异常的机会。不过,操作系统自己定义应用程序和80386异常机制之间的接口。 表2-2高亮显式了那些应用程序感兴趣的异常。 + 当DIV或IDIV的分母为零或商对于目的操作数太大均产生除数为零异常。(DIV和IDIV的讨论参见第3章。) + 从陷阱标志位(TF)产生的调试异常将重返应用程序。 + 当执行INT 3后产生中断点异常。该指令被调试器用来在指定地点中断程序的执行。 + 当执行INTO指令或OF(overflow)标志被置位(在算术操作后,置位OF标志)时,产生溢出异常。(有关INTO的讨论参见第3章)。 + 当执行BOUND指令或数组索引超出数组边界时,产生边界检查异常。(有关BOUND指令的讨论参见第3章。) + 非法操作码在一些应用中用来扩展指令集。这种情况下,非法指令异常的产生让我们有机会模拟操作码。 + 当程序中用到了协处理器指令,但系统中却没有协处理器时,产生“协处理器不可得”异常。 + 当协处理器检测到非法操作时,产生协处理器错误。 INT指令在任何时候执行时都会产生中断;处理器把这个中断按照异常来处理。这个中断的作用(以及所有其他异常)取决于应用程序提供的异常处理程序,或者作为系统软件的一部分(由系统程序提供)。INT指令本身在第3章讨论。有关异常的完整讨论参见第9章。 表2-2 80386保留异常和中断 | 向量号 | 描述 | | --- | --- | | 0 | 除数错误 | | 1 | 调试异常 | | 2 | 不可屏蔽(NMI)中断 | | 3 | 中断点 | | 4 | INTO检测溢出 | | 5 | BOUND越界 | | 6 | 非法操作码 | | 7 | 协处理器不可得 | | 8 | 双精度异常 | | 9 | 协处理器段溢出 | | 10 | 非法任务状态段 | | 11 | 段缺失 | | 12 | 堆栈错误 | | 13 | 通用保护 | | 14 | 页错误 | | 15 | (保留) | | 16 | 协处理器错误 | | 17-32 | (保留) |