IBM PC系統中存在兩種基本形式的中斷。當外設(如鍵盤、磁盤機、時鐘)產生信號時,稱為硬件中斷。這些信號經由中斷控制器根據優先級排序,再提交CPU處理。另一種是軟件中斷(亦稱陷阱 Trap),由執行中的程序主動觸發(如 INT 21H),主要用於請求作業系統服務。雖然處理流程相同,但用途截然不同。
表3.1列出了IBM PC預定義的中斷向量表。應用程序員鮮少直接操作硬件中斷,除非涉及特殊硬體或嚴格時序要求;最常被修改的是鍵盤中斷(INT 9H),多見於文本編輯器。相比之下,軟件中斷是所有程序員(無論匯編或高級語言)通往DOS/BIOS服務的必經之路,其中INT 21H是DOS系統調用的核心入口,而ROM-BIOS中斷則提供鍵盤輸入、螢幕輸出、磁碟讀寫等底層服務。
以鍵盤讀取為例:使用者按鍵產生硬件中斷 INT 9H,底層處理程序讀取掃描碼並存入鍵盤緩衝區(隊列滿時發出蜂鳴),隨後返回原程序。當應用程序需讀取字符時,發出軟件中斷 INT 16H,由對應處理程序從隊列取出首字符返回。這種「中斷驅動」模式將「發起輸入的應用程序」與「執行輸入的硬件處理邏輯」解耦,廣泛應用於各類I/O設備。
中斷向量表位於內存最低端 0000:0000,佔用1KB(256項 × 4字節)。每項包含段地址與偏移地址。修改向量有兩條路徑:直接寫入內存、或調用DOS系統調用(INT 21H 功能 25H/35H)。
直接寫入範例:
mov ax, 0
mov es, ax
mov word ptr es:[24h], offset Keyboard ; INT 9H 偏移
mov word ptr es:[26h], seg Keyboard ; INT 9H 段地址
若在兩條 MOV 指令之間發生鍵盤中斷,向量將處於半更新狀態,導致系統死機。改進方案:
CLI/STI 關閉/開啟可屏蔽中斷(但無法阻止 NMI)。REP MOVSW 單指令原子複製(含 NMI 保護):mov word ptr kbd_ptr[0], offset Keyboard
mov word ptr kbd_ptr[2], seg Keyboard
mov di, 0
mov es, di
mov di, 24h
mov si, offset kbd_ptr
mov cx, 2
cld
cli
rep movsw ; 原子複製 2 字
sti
kbd_ptr dd ?
DOS提供安全的讀/寫中斷向量功能,無需自行處理原子性:
AH=35H, AL=中斷號 → 返回 ES:BXAH=25H, AL=中斷號, DS:DX=新處理程序地址; 保存舊向量
Old_Keyboard_IO dd ?
mov al, 16h
mov ah, 35h
int 21h
mov word ptr Old_Keyboard_IO, bx
mov word ptr Old_Keyboard_IO+2, es
; 設置新向量
New_Keyboard_IO dd ?
mov dx, offset New_Keyboard_Handler
mov ds, seg New_Keyboard_Handler
mov al, 16h
mov ah, 25h
int 21h
採用COM格式開發時,可編寫批處理簡化編譯鏈接:
MASM %1
LINK %1
EXE2BIN %1.EXE %1.COM
使用:C:\MAKE MACRO.ASM 即可一鍵生成 MACRO.COM。
該程序掃描預定義中斷表,調用DOS功能 35H 讀取並以十六進制格式輸出當前向量內容。啟動後按任意鍵退出。可用於觀察TSR安裝前後的向量變化。核心邏輯:
disptab 定義中斷號與描述字符串指標dvector 顯示每項:描述 + 中斷號 + ES:BX 完整地址dchar 走 INT 10H 0EH 功能)直接操作顯示硬件完整源碼見原文,包含所有標準中斷(08H時鐘、09H鍵盤、1CH定時器、21HDOS等)的描述字符串與格式化輸出邏輯。