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

組合語言開發DOS下內存駐留程序(一):TSR核心原理與DOS重入性分析

     編輯:組合語言

緒言:TSR與中斷系統

TSR(Terminate and Stay Resident)程序加載後常駐內存,滿足條件(熱鍵、定時器、硬件中斷)彈出執行。常見形式:SideKick彈出工具、日曆、網絡服務、中文系統(CCDOS/UCDOS)、病毒程序。其調度機制即中斷系統:

  • 硬件中斷:INT 08H(時鐘)、INT 09H(鍵盤)、INT 13H(磁盤)、INT 14H(串口)
  • 軟件中斷:INT 16H(鍵盤服務)、INT 1CH(定時器)、INT 21H(DOS)
  • 組合觸發

中斷向量表位於 0000:0000,256項×4字節。中斷發生時CPU自動:壓入標誌、CS、IP → CLI → 跳轉向量指向的處理程序。IRET 恢復現場返回。

0.2 DOS可重入性深度剖析

多任務OS依賴可重入代碼與PV操作保護臨界資源。DOS為單任務系統,整體不可重入:內部數據區非棧分配,中斷嵌套調用DOS會破壞前台數據。

可重入與不可重入對比

可重入例程:僅使用寄存器/參數,無靜態變量。中斷嵌套再入不影響結果。

不可重入例程:使用靜態變量 Temp。中斷嵌套修改 Temp 導致外層返回錯誤結果。解決:將變量放入堆疊(PUSH BP / SUB SP,2 / MOV BP,SP)。

DOS重入性限制總結

  • 內部堆疊切換:DOS擁有I/O、磁盤、輔助三個內部堆疊。前台佔用某堆疊時,TSR調用同堆疊功能會覆蓋數據。功能 33H/50H/51H/62H/64H 使用用戶堆疊,始終可重入。
  • InDOS標誌 (34H):指示DOS是否忙碌。TSR啟動前必須檢查,忙碌時不可調用 INT 21H。
  • 擴展錯誤信息:59H 讀取、5D0AH 恢復。TSR激活前必須保存/恢復,否則前台讀到錯誤信息。
  • 硬件中斷不可重入:INT 13H/0BH/0CH 等。進入時設置標誌,TSR檢測到標誌則放棄調用。
  • 避免重入:INT 10H/25H/26H 同理設置進入標誌。
  • 接管關鍵中斷:INT 1BH/23H/24H (Ctrl-Break、Ctrl-C、致命錯誤)。
  • SDA交換技術:保存/恢復 5D06H/5D0BH 可使DOS任意時刻可重入,但關鍵區(INT 2AH 進入、81H/82H 退出)內不可修改SDA。

0.3 TSR設計通用流程

TSR分暫駐部分(安裝/檢測/刪除)與常駐部分(中斷處理程序)。核心步驟:

  1. 獲取中斷向量(INT 21H/35H)
  2. 保存舊向量
  3. 設置新向量(INT 21H/25H)
  4. 中斷鏈接(調用舊處理程序)
  5. 檢測是否已常駐(避免重複安裝)
  6. 執行 INT 21H/31H 終止並常駐
  7. 刪除TSR:檢查向量是否被後續程序篡改 → 修改PSP父進程指鈕 → INT 21H/4CH 釋放內存 → 恢復寄存器

無條件刪除需監控所有TSR對IVT、MCB、設備驅動鏈的修改。

0.5 常用縮寫表

ASCIZ、BPD、CDS、DPB、DPL、DTA、FAT、FCB、IFS、JFT、NCB、PSP、SDA、SFT 等關鍵數據結構縮寫及含義對照表。

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