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

序列埠中斷攔截器:COMINT.ASM 原始碼解析

     編輯:組合語言

前言

COMINT.ASM 是一個經典的終止並駐留 (TSR) 程式,用於攔截序列通訊埠中斷 (INT 14h),並提供一個新的中斷入口 (INT 44h) 供應用程式啟用/停用攔截功能。這類程式在早期 BBS 系統、終端機模擬器、資料機控制軟體中廣泛應用。

程式架構

progseg segment para public 'CODE'
 public setcom
 assume cs:progseg, ds:progseg, es:progseg
 org 100h          ; COM 檔案入口偏移
 doscall equ 21h

標準 COM 格式:ORG 100h,單一區段包含程式碼、資料與堆疊。

核心功能流程

安裝階段 (startup)

  1. 檢查 INT 44h 向量是否已被使用 (AH=35h, AL=44h),若 BX≠0 或 ES≠0 則顯示「已安裝」訊息並退出 (INT 20h)。
  2. 取得原始 INT 14h (序列埠中斷) 向量 (AH=35h, AL=14h),保存至 vector 緩衝區 (8 位元組,實際需 4 位元組)。
  3. 設定 INT 44h 指向 setcom 程序 (AH=25h, AL=44h)。
  4. 顯示安裝成功訊息。
  5. 以 INT 27h 終止並駐留,駐留大小為 setup 標號位址 (包含程式碼、資料、訊息、向量緩衝區)。

攔截處理程序 (setcom)

透過 INT 44h 呼叫,AL 為功能碼:

  • AL=1 (啟用):恢復原始 INT 14h 向量 (AH=25h, AL=14h, DS:DX=vector)。
  • AL=0 (停用):設定 INT 14h 指向內部 interupt 程序 (AH=25h, AL=14h, DS:DX=interupt)。

interupt 程序極簡單:SUB AX,AX 清零狀態,IRET 返回。有效「吞掉」所有序列埠中斷,防止 BIOS/ROM-BIOS 處理。

關鍵技術細節

  • 中斷向量操作:標準 DOS INT 21h AH=35h/25h 取得/設定向量。
  • TSR 駐留:INT 27h 為舊式 TSR 介面,DX 指定駐留結束位址 (PSP:DX)。缺點是無法傳回退出碼,且駐留記憶體不可釋放。
  • 重複安裝檢查:檢查 INT 44h 向量非零作為已安裝標記,簡單但有效。
  • 區段暫存器管理:setcom 入口保存/恢復 DS、ES,確保中斷處理期間段暫存器正確。
  • 訊息字串:使用 INT 21h AH=09h 輸出 `$` 結尾字串。

潛在問題與改進方向

  1. INT 27h 限制:建議改用 INT 21h AH=31h (終止並駐留,可指定退出碼與區塊大小)。
  2. 中斷鏈完整性:停用時直接指向內部 interupt,未考慮鏈上其他攔截器。正確做法應恢復原始向量 (啟用時) 或鏈接下一個處理器。
  3. 向量緩衝區大小:vector db 8 dup(0) 浪費 4 位元組,DQ 或兩個 DW 即可。
  4. 並發存取:無互斥保護,多程式同時呼叫 INT 44h 可能導致競態條件。
  5. 硬體中斷處理:僅攔截軟體中斷 INT 14h,未處理實際硬體中斷 (IRQ 3/4),對即時通訊影響有限。

結語

COMINT.ASM 展示了 DOS 時代 TSR 程式的典型結構:中斷向量攔截、功能分派、駐留安裝。雖然實作簡單,但涵蓋了中斷處理、記憶體駐留、使用者介面等核心要素。現代作業系統已禁止應用程式直接操作中斷向量,但「攔截-過濾-轉發」的中介軟體模式在驅動程式開發、系統監控、安全防護中依然普遍存在。理解這段歷史程式碼,有助於掌握底層系統擴充的基本思維。

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