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

DOS 時代組合語言原始碼賞析:CALC 計算機常駐程式 (TSR) 啟動器

     編輯:組合語言

前言

本文收錄 CALC.ASM,功能為檢測並啟動常駐記憶體中的計算機程式 (PEMATH)。屬於 TSR (Terminate and Stay Resident) 協作模式的「啟動器」端:掃描中斷向量表確認 PEMATH 是否已安裝 (以特徵字串 "PEMATH" 識別),若存在則呼叫其進入點中斷,否則顯示錯誤訊息。展示了中斷向量表掃描、TSR 識別機制、遠呼叫介面、極簡 .COM 程式結構。

程式運作流程

  1. 存取中斷向量表 (0000:0000) 取得 INT 61h 向量 (預設計算機中斷號)
  2. 向量指向的程式碼偏移 +4 處檢查特徵字串 "PEMATH"
  3. 若匹配:INT 61h 呼叫常駐計算機
  4. 若不匹配:輸出 "PEMATH is not resident" 至標準輸出 (控制代碼 1)
  5. INT 20h 退出

完整原始碼

PAGE ,132
TITLE CALC
CGROUP GROUP CODESEG
CODESEG SEGMENT PARA PUBLIC 'CODE'
 ASSUME CS:CGROUP,DS:CGROUP,ES:CGROUP
 PUBLIC CALC
 ORG 100H
CALC PROC FAR
 JMP START
INT_NUMBER DB 61h
SCREEN_HANDLE DW 0001h
MESSAGE DB 'PEMATH is not resident',13,10
MESSAGE_LEN EQU $-MESSAGE
TAG DB 'PEMATH'
TAG_LEN EQU $-TAG
START:
 SUB AX,AX
 MOV ES,AX
 SUB BH,BH
 MOV BL,INT_NUMBER
 SHL BX,1
 SHL BX,1
 MOV DI,ES:[BX]
 MOV ES,ES:[BX+2]
 ADD DI,4
 LEA SI,TAG
 MOV CX,TAG_LEN
 REPE CMPSB
 JE CALL_CALC
 MOV BX,SCREEN_HANDLE
 MOV CX,MESSAGE_LEN
 LEA DX,MESSAGE
 MOV AH,40h
 INT 21h
 JMP SHORT CALC_EXIT
CALL_CALC:
 MOV AL,INT_NUMBER
 MOV BYTE PTR INT_CODE,AL
 DB 0CDh
INT_CODE:
 DB 00h
 NOP
 NOP
CALC_EXIT:
 INT 20h
CALC ENDP
CODESEG ENDS
END CALC

關鍵技術解析

1. 中斷向量表掃描與 TSR 識別


SUB AX,AX
MOV ES,AX              ; ES = 0 (中斷向量表段)
MOV BL,INT_NUMBER (61h)
SHL BX,1; SHL BX,1     ; BX = 61h * 4 = 184h (向量表偏移)
MOV DI,ES:[BX]         ; DI = 向量位移
MOV ES,ES:[BX+2]       ; ES = 向量段基址
ADD DI,4               ; 跳過中斷處理常式開頭指令,指向特徵字串位置
LEA SI,TAG             ; "PEMATH"
MOV CX,TAG_LEN (6)
REPE CMPSB             ; 比較 6 位元組
JE CALL_CALC
  • INT n 向量佔 4 位元組:位移 (IP) + 段基址 (CS)
  • TSR 程式慣例在進入點後放置特徵字串供識別
  • REPE CMPSB 重複比較字串,CX 為計數,ZF=1 時繼續

2. 動態構建 INT 指令呼叫 TSR


CALL_CALC:
 MOV AL,INT_NUMBER (61h)
 MOV BYTE PTR INT_CODE,AL  ; 修改下一條指令的中斷號
 DB 0CDh                   ; INT 指令操作碼
INT_CODE:
 DB 00h                    ; 此處被執行時修改為 61h
 NOP
 NOP

利用自我修改代碼 在運行時構建 INT 61h 指令 (CD 61),避免硬編碼中斷號,靈活性極高。

3. 錯誤訊息輸出至標準輸出


MOV BX,SCREEN_HANDLE (1)  ; STDOUT
MOV CX,MESSAGE_LEN
LEA DX,MESSAGE
MOV AH,40h                ; WRITE
INT 21h

使用檔案控制代碼 1 (標準輸出) 配合 AH=40h 寫入字串,而非 AH=09h (需 $ 結尾)。

4. .COM 程式結構

  • ORG 100h:.COM 載入位址偏移
  • CGROUP GROUP CODESEG + ASSUME CS:CGROUP,DS:CGROUP,ES:CGROUP:小模型,單段
  • PUBLIC CALC + END CALC:進入點標號
  • INT 20h:標準 .COM 退出方式

TSR 協作模式架構

角色程式功能
常駐核心PEMATH (未提供原始碼)掛載 INT 61h、提供計算機功能、特徵字串 "PEMATH"
啟動器CALC檢測常駐核心、呼叫 INT 61h、錯誤提示
用戶鍵盤熱鍵或命令列執行 CALC.COM 喚起計算機

現代對應與啟發

CALC/TSR 技術現代對應
中斷向量表掃描識別 TSR共享記憶體/命名管道/註冊表/服務發現檢測常駐服務
特徵字串驗證API 版本檢查、健康檢查端點、IsServiceRunning()
自我修改代碼構建 INT 指令動態程式碼生成、JIT 編譯、emit 指令
遠中斷呼叫介面RPC/IPC/系統呼叫/syscall 指令
.COM 單一檔案無依賴靜態連結單一二進位、go build -ldflags="-s -w"

學習重點

  • 實模式中斷向量表結構:0000:0000 起始,每向量 4 位元組 (IP+CS)
  • TSR 識別慣例:特徵字串、版本號、檢查和
  • REPE CMPSB 字串比較指令用法
  • 自我修改代碼技術:運行時修改指令操作數 (MOV BYTE PTR [INT_CODE], AL)
  • 標準輸出寫入:AH=40h, BX=1 vs AH=09h, DS:DX=$終止字串
  • .COM 程式最小化模板:ORG 100h、INT 20h 退出

總結

CALC.ASM 是 TSR 生態系中「啟動器」的經典實現:掃描中斷向量 → 驗證特徵字串 → 動態構建中斷呼叫 → 錯誤回饋。其核心思想——服務發現、介面契約、動態調用、優雅降級——在現代微服務架構、外掛系統、熱插拔模組中依然是核心設計模式。研讀此碼,可窺見「常駐服務與啟動器分離」架構在 16 位實模式下的極簡本質。

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