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,單一區段包含程式碼、資料與堆疊。
AH=35h, AL=44h),若 BX≠0 或 ES≠0 則顯示「已安裝」訊息並退出 (INT 20h)。AH=35h, AL=14h),保存至 vector 緩衝區 (8 位元組,實際需 4 位元組)。setcom 程序 (AH=25h, AL=44h)。INT 27h 終止並駐留,駐留大小為 setup 標號位址 (包含程式碼、資料、訊息、向量緩衝區)。透過 INT 44h 呼叫,AL 為功能碼:
AH=25h, AL=14h, DS:DX=vector)。interupt 程序 (AH=25h, AL=14h, DS:DX=interupt)。interupt 程序極簡單:SUB AX,AX 清零狀態,IRET 返回。有效「吞掉」所有序列埠中斷,防止 BIOS/ROM-BIOS 處理。
INT 21h AH=35h/25h 取得/設定向量。INT 27h 為舊式 TSR 介面,DX 指定駐留結束位址 (PSP:DX)。缺點是無法傳回退出碼,且駐留記憶體不可釋放。setcom 入口保存/恢復 DS、ES,確保中斷處理期間段暫存器正確。INT 21h AH=09h 輸出 `$` 結尾字串。INT 21h AH=31h (終止並駐留,可指定退出碼與區塊大小)。interupt,未考慮鏈上其他攔截器。正確做法應恢復原始向量 (啟用時) 或鏈接下一個處理器。vector db 8 dup(0) 浪費 4 位元組,DQ 或兩個 DW 即可。COMINT.ASM 展示了 DOS 時代 TSR 程式的典型結構:中斷向量攔截、功能分派、駐留安裝。雖然實作簡單,但涵蓋了中斷處理、記憶體駐留、使用者介面等核心要素。現代作業系統已禁止應用程式直接操作中斷向量,但「攔截-過濾-轉發」的中介軟體模式在驅動程式開發、系統監控、安全防護中依然普遍存在。理解這段歷史程式碼,有助於掌握底層系統擴充的基本思維。