二十三、中断(控制计算机硬件,避免使用0000:0000-0000:03FF内存地址)
1、中斷(運行過程中出現的各種特殊信息的處理程序)
?? ?中斷信息:CPU在執行指令的同時,檢測到CPU外部或內部發送過來的一種特殊信息。
2、內中斷(比如除法溢出,用1000除以1,8位寄存器放不下1000,于是溢出自動中斷,由其內部中斷)
?? ?CPU在執行指令的時候,其內部由于某種原因所發出的中斷信息。
?? ?計算機用中斷類型碼(字節型數據00-FF)來標識中斷信息的來源(解釋中斷嗎,打印相應錯誤信息)。(比如除法溢出信息)
3、中斷處理程序(比如除法溢出,用1000除以1,8位寄存器放不下1000,于是溢出自動中斷)
?? ?CPU用于自動處理中斷信息的程序。
4、中斷向量表(各個中斷信息入口地址,CPU發現中斷后自動尋找向量表,然后找到對應的處理中斷信息)
?? ?中斷處理程序的入口地址列表。
?? ?中斷向量表在計算機啟動后,將256個中斷源所對應的中斷處理程序的入口地址存放到內存地址0000:0000到0000:03FF的單元中。
?? ?每個表項存放一個向量,占用兩個字,分別存放入口地址的段地址與偏移地址,高地址存放段地址,低地址存放偏移地址。
5、BIOS中斷例程(控制計算機硬件,計算機硬件安裝)
?? ?BIOS中斷例程由計算機硬件在啟動后自動安裝到中斷向量表中。
? ? BIOS中斷表:https://blog.csdn.net/u012206617/article/details/86720455
;當前光標位置輸出8個'C' assume cs:code,ds:data,ss:stack data segmentdw 256 dup (0H) data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ah,09H ;詳細查看BIOS中斷表mov al,'c'mov bh,0Hmov bl,07Hmov cx,08Hint 10Hmov ax,4c00Hint 21H code ends end start6、DOS中斷例程(控制計算機硬件,計算機操作系統安裝)
?? ?DOS中斷例程由Dos操作系統在計算機啟動后自動安裝到中斷向量表中。
assume cs:code,ds:data,ss:stack data segmentdw 'china os$' data endsstack segmentdw 256 dup (0H) stack endscode segment start:mov ax,data ;輸出設備上輸出'china os'mov ds,axmov dx,0Hmov ah,09Hint 21Hmov ax,4c00Hint 21H code ends end start?
?
BIOS(實模式)的中斷向量表如下:
80x86
| I/O ADDR | INT TYPE(16進制) | FUNCTION |
| 00 ~ 03 | 0 | 除法溢出中斷 |
| 04 ~ 07 | 1 | 單步(用于DEBUG) |
| 08 ~ 0B | 2 | 非屏蔽中斷(NMI) |
| 0C ~ 0F | 3 | 斷點中斷(用于DEBUG) |
| 10 ~ 13 | 4 | 溢出中斷 |
| 14 ~ 17 | 5 | 打印屏幕 |
| 18 ~ 1F | 6/7 | 保留 |
8259主片
| I/O ADDR | INT TYPE(16進制) | FUNCTION |
| 20 ~ 23 | 8 | 定時器(IRQ0) |
| 24 ~ 27 | 9 | 鍵盤(IRQ1) |
| 28 ~ 2B | A | 彩色/圖形(IRQ2) |
| 2C ~ 2F | B | 串行通信COM2(IRQ3) |
| 30 ~ 33 | C | 串行通信COM1(IRQ4) |
| 34 ~ 37 | D | LPT2控制器中斷(IRQ5) |
| 38 ~ 3B | E | 磁盤控制器中斷(IRQ6) |
| 3C ~ 3F | F | LPT1控制器中斷(IRQ7) |
BIOS
| I/O ADDR | INT TYPE(16進制) | FUNCTION |
| 40 ~43 | 10 | 視頻顯示 I/O |
| 44 ~ 47 | 11 | 設備檢驗 |
| 48 ~ 4B | 12 | 測定存儲器容量 |
| 4C ~ 4F | 13 | 磁盤 I/O |
| 50 ~ 53 | 14 | RS-232?串行口?I/O |
| 54 ~ 57 | 15 | 系統描述表指針 |
| 58 ~ 5B | 16 | 鍵盤 I/O |
| 5C ~ 5F | 17 | 打印機 I/O |
| 60 ~ 63 | 18 | ROM BASIC 入口代碼 |
| 64 ~ 67 | 19 | 引導裝入程序 |
| 68 ~ 6B | 1A | 日時鐘 |
提供用戶中斷
| I/O ADDR | INT TYPE(16進制) | FUNCTION |
| 6C ~ 6F | 1B | Ctrl - Break 控制的軟中斷 |
| 70 ~ 73 | 1C | 定時器控制的軟中斷 |
| 74 ~ 77 | 1D | 視頻參數塊 |
| 78 ~ 7B | 1E | 軟盤參數塊 |
| 7C ~ 7F | 1F | 圖形字符擴展碼 |
在DOS系統(實模式)下,從0x20開始,用于操作系統本身。
DOS
| I/O ADDR | INT TYPE(16進制) | FUNCTION |
| 80 ~ 83 | 20 | DOS 中斷返回 |
| 84 ~ 87 | 21 | DOS 系統功能調用 |
| 88 ~ 8B | 22 | 程序中止時 DOS 返回地址(用戶不能直接調用) |
| 8C ~ 8F | 23 | Ctrl - Break 處理地址(用戶不能直接調用) |
| 90 ~ 93 | 24 | 嚴重錯誤處理(用戶不能直接調用) |
| 94 ~ 97 | 25 | 絕對磁盤讀功能 |
| 98 ~ 9B | 26 | 絕對磁盤寫功能 |
| 9C ~ 9F | 27 | 終止并駐留程序 |
| A0 ~ A3 | 28 | DOS安全使用 |
| A4 ~ A7 | 29 | 快速寫字符 |
| A8 ~ AB | 2A | Microsoft 網絡接口 |
| B8 ~ BB | 2E | 基本 SHELL 程序裝入 |
| BC ~ BF | 2F | 多路服務中斷 |
| CC ~ CF | 33 | 鼠標中斷 |
| 104 ~ 107 | 41 | 硬盤參數塊 |
| 118 ~ 11B | 46 | 第二硬盤參數塊 |
| 11C ~ 3FF | 47 ~ FF | BASIC 中斷 |
保護模式
在Linux下(保護模式),沒有使用BIOS設置的中斷向量表,0x00 ~ 0x1F是CPU保護模式下的默認中斷向量,而0x20開始,都是被Linux系統重新設置的。
X86占用的中斷向量表如下:
| 0 | #DE | 除出錯 | 故障 | 無 | DIV或IDIV指令。 |
| 1 | #DB | 調試 | 故障/陷阱 | 無 | 任何代碼或數據引用,或是INT 1指令。 |
| 2 | -- | NMI中斷 | 中斷 | 無 | 非屏蔽外部中斷。 |
| 3 | #BP | 斷點 | 陷阱 | 無 | INT 3指令。 |
| 4 | #OF | 溢出 | 陷阱 | 無 | INTO指令。 |
| 5 | #BR | 邊界范圍超出 | 故障 | 無 | BOUND指令。 |
| 6 | #UD | 無效操作碼 | 故障 | 無 | UD2指令或保留的操作碼。 |
| 7 | #NM | 設備不存在 | 故障 | 無 | 浮點或WAIT/FWAIT指令。 |
| 8 | #DF | 雙重錯誤 | 異常終止 | 有(0) | 任何可產生異常、NMI或INTR的指令。 |
| 9 | -- | 協處理器段超越(保留) | 故障 | 無 | 浮點指令 |
| 10 | #TS | 無效的任務狀態段TSS | 故障 | 有 | 任務交換或訪問TSS |
| 11 | #NP | 段不存在 | 故障 | 有 | 加載段寄存器或訪問系統段 |
| 12 | #SS | 堆棧段錯誤 | 故障 | 有 | 堆棧操作或SS寄存器加載 |
| 13 | #GP | 一般保護錯誤 | 故障 | 有 | 任何內存引用和其他保護檢查 |
| 14 | #PF | 頁面錯誤 | 故障 | 有 | 任何內存引用 |
| 15 | -- | (intel保留) | ? | 無 | ? |
| 16 | #MF | x87 FPU浮點錯誤 | 故障 | 無 | ? |
| 17 | #AC | 對齊檢查 | 故障 | 有(0) | 對內存中任何數據的引用。 |
| 18 | #MC | 機器檢查 | 異常終止 | 無 | 錯誤碼(若有)和產生源與CPU類型有關。 |
| 19 | #XF | SIMD浮點異常 | 故障 | 無 | ? |
Linux自己設置的中斷以后再添加。
?
?
?
總結
以上是生活随笔為你收集整理的二十三、中断(控制计算机硬件,避免使用0000:0000-0000:03FF内存地址)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos下 Tcpreplay 重放
- 下一篇: Latex可能遇到的一些问题