## 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實地址模式的不同