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