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