## 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 | (保留) |
- 第一章 80386介绍
- 1.1 该手册的组织结构
- 1.2 其他文献
- 第二章 编程基本模型
- 2.1 存储器组织和段
- 2.2 数据类型
- 2.3 寄存器
- 2.4 指令格式
- 2.5 操作数选择
- 2.6 中断和异常
- 第4章 系统寄存器
- 4.1 系统寄存器 (System Registers)
- 4.2 系统指令 (System Instructions)
- 第五章 内存管理
- 5.1 分段地址转换(Segment Translation)
- 5.2 分页地址转换(Page Translation)
- 5.3 混合分段和分页地址转换(Combining Segment and Page Translation)
- 第六章 内存管理
- 6.1 为什么要保护(Why Protection?)
- 6.2 80386保护机制概述(Overview of 80386 Protection Mechnaisms)
- 6.3 段级保护(Segment-Level Protection)
- 6.4 页级保护(Page-Level Protection)
- 6.5 混合分页和分段保护(Combining Page and Segment Protection)
- 第7章 多任务(Multitasking)
- 8.1 I/O 寻址(I/O Addressing)
- 7.1 任务状态段(Task State Segment)
- 7.3 任务寄存器(Task Register)
- 7.4 任务门描述符(Task Gate Descriptor)
- 7.5 任务切换(Task Switching)
- 7.6 任务链(Task Linking)
- 7.7 任务寻址空间(Task Address Space)
- 第8章 输入 输出
- 8.2 I/O 指令(I/O Instructions)
- 8.3 保护和I/O(Protection and I/O)
- 第9章 异常和中断(Exceptions and Interrupts)
- 9.1 识别中断(Identifying Interrupts)
- 9.2 允许和禁止中断(Enabling and Disabling Interrupts)
- 9.3 同时发生的中断和异常的优先级(Priority Among Simultaneous Interrupts and Exceptions)
- 9.4 中断描述符表(Interrupt Descriptor Table)
- 9.5 IDT 描述符(IDT Descriptors)
- 9.6 中断任务和中断子程序(Interrupt Tasks and Interrupt Procedures)
- 9.7 出错码(Error Code)
- 9.8 异常条件(Exception Conditions)
- 9.9 异常总结(Exception Summary)
- 9.10 出错码总结(Error Code Summary)
- 第10章 初始化(Initialization)
- 10.1 复位后处理器状态(Processor State After Reset)
- 10.2 实模式初始化(Software Initialization for Real-Address Mode)
- 10.3 切换到保护模式(Switching to Protected Mode)
- 10.4 保护模式初始化(Software Initialization for Protected Mode)
- 10.5 初始化示例
- 10.6 TLB测试
- 第十四章 80386实地址模式
- 14.1 物理地址构成
- 14.2 寄存器和指令
- 14.3 中断和异常处理
- 14.4 进入和离开实地址模式
- 14.6 实地址模式异常
- 14.7 与8086的不同
- 14.8 与80286实地址模式的不同