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 | (保留) |