## 9.2 允许和禁止中断(Enabling and Disabling Interrupts)
处理器只在一条指令结束和下一条指令开始之间进行中断服务。当一个串指令有REP前缀时,中断和异常可以在每次叠代期间发生。所以长的串指令不会使处理器长时间不响应中断。
一定的条件和标志设置了以后,处理器会在指令边界禁止一些中断和异常。
### 9.2.1 NMI 屏蔽后来的NMIS(NMI Masks Further NMIS)
当一个NMI处理程正在执行时,处理器忽略后来的NMI引脚发送过来的中断信号,一直到下一条IRET指令被执行。
### 9.2.2 IF 屏蔽INTR(IF Masks INTR)
IF标志(interrupt-enable flag)控制着处理器是否接受由INTR引脚引起的外部中断。当IF=0时,INTR中断被屏蔽。当IF=1时,INTR中断被允许。和其它标志位一样,处理器在接收到一个RESET信号时,将清除IF位。CLI和STI指令用于改变IF位。
CLI(清中断允许位)和STI(设置中断允许位)显示的设置IF位(标志寄存器的位-9)。这些指令只能在CPL<=IOPL时才可以执行。如果CPL>=IOPL时,执行这些指令将引发通用保护异常。
IF被以下指令隐式的操作:
+ PUSHF存储所有标志,包含IF,到堆栈上,这样他们就可以被检测了。
+ 任务切换和POPF指令、IRET指令都加载标志寄存器。因此,将更改IF位。
+ 通过中断门的中断将自动清除IF位,禁止中断。(这一章后面将介绍中断门)
### 9.2.3 RF 屏蔽调试错误(RF Masks Debug Faults)
标志寄存器中的RF位控制着调试中断的识别。这样可以在一条指令只引发一次调试中断,不管多少次的指令重起。(关于调试,参看第12章)
### 9.2.4 MOV 或POP 到SS将屏蔽一些中断和异常(MOV or POP to SS Masks Some Interrupts and Exceptions)
一些要改变堆栈段寄存器的软件通常会这样做:
MOV SS,AX
MOV ESP,StackTop
如果在SS加载后,而ESP加载前发生了一个中断或异常,在中断处理程序中堆栈的两部分将是不一致。
为了防止这种情况发生,80386在一条MOV 或POP向SS加载了值后,将会在指令的边界屏蔽INTR、NMI、调试异常、单步陷阱等。但一些异常还是可能发生的,例如,缺页异常和通用保护异常。如果总是使用80386的LSS指令,则不会产生这个问题。
- 第一章 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实地址模式的不同