首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

組合語言開發DOS下內存駐留程序(三):中斷向量深度解析

     編輯:組合語言

三、中斷向量

3.1 IBM PC提供的中斷類型

IBM PC系統中存在兩種基本形式的中斷。當外設(如鍵盤、磁盤機、時鐘)產生信號時,稱為硬件中斷。這些信號經由中斷控制器根據優先級排序,再提交CPU處理。另一種是軟件中斷(亦稱陷阱 Trap),由執行中的程序主動觸發(如 INT 21H),主要用於請求作業系統服務。雖然處理流程相同,但用途截然不同。

表3.1列出了IBM PC預定義的中斷向量表。應用程序員鮮少直接操作硬件中斷,除非涉及特殊硬體或嚴格時序要求;最常被修改的是鍵盤中斷(INT 9H),多見於文本編輯器。相比之下,軟件中斷是所有程序員(無論匯編或高級語言)通往DOS/BIOS服務的必經之路,其中INT 21H是DOS系統調用的核心入口,而ROM-BIOS中斷則提供鍵盤輸入、螢幕輸出、磁碟讀寫等底層服務。

3.2 鍵盤輸入的雙重中斷機制

以鍵盤讀取為例:使用者按鍵產生硬件中斷 INT 9H,底層處理程序讀取掃描碼並存入鍵盤緩衝區(隊列滿時發出蜂鳴),隨後返回原程序。當應用程序需讀取字符時,發出軟件中斷 INT 16H,由對應處理程序從隊列取出首字符返回。這種「中斷驅動」模式將「發起輸入的應用程序」與「執行輸入的硬件處理邏輯」解耦,廣泛應用於各類I/O設備。

3.3 修改中斷向量的安全實踐

中斷向量表位於內存最低端 0000:0000,佔用1KB(256項 × 4字節)。每項包含段地址與偏移地址。修改向量有兩條路徑:直接寫入內存、或調用DOS系統調用(INT 21H 功能 25H/35H)。

3.3.1 直接修改的風險與對策

直接寫入範例:

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 指令之間發生鍵盤中斷,向量將處於半更新狀態,導致系統死機。改進方案:

  1. 使用 CLI/STI 關閉/開啟可屏蔽中斷(但無法阻止 NMI)。
  2. 採用 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 ?

3.3.2 使用DOS服務修改(推薦)

DOS提供安全的讀/寫中斷向量功能,無需自行處理原子性:

  • 讀取:AH=35H, AL=中斷號 → 返回 ES:BX
  • 設置:AH=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

3.4 開發工具鏈簡化:MAKE.BAT

採用COM格式開發時,可編寫批處理簡化編譯鏈接:

MASM %1
LINK %1
EXE2BIN %1.EXE %1.COM

使用:C:\MAKE MACRO.ASM 即可一鍵生成 MACRO.COM。

3.5 實戰工具:顯示所有關鍵中斷向量 (IVEC.ASM)

該程序掃描預定義中斷表,調用DOS功能 35H 讀取並以十六進制格式輸出當前向量內容。啟動後按任意鍵退出。可用於觀察TSR安裝前後的向量變化。核心邏輯:

  • 數據表 disptab 定義中斷號與描述字符串指標
  • 主循環調用 dvector 顯示每項:描述 + 中斷號 + ES:BX 完整地址
  • 底層輸出例程(dchar 走 INT 10H 0EH 功能)直接操作顯示硬件

完整源碼見原文,包含所有標準中斷(08H時鐘、09H鍵盤、1CH定時器、21HDOS等)的描述字符串與格式化輸出邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved