本文收錄 CALC.ASM,功能為檢測並啟動常駐記憶體中的計算機程式 (PEMATH)。屬於 TSR (Terminate and Stay Resident) 協作模式的「啟動器」端:掃描中斷向量表確認 PEMATH 是否已安裝 (以特徵字串 "PEMATH" 識別),若存在則呼叫其進入點中斷,否則顯示錯誤訊息。展示了中斷向量表掃描、TSR 識別機制、遠呼叫介面、極簡 .COM 程式結構。
0000:0000) 取得 INT 61h 向量 (預設計算機中斷號)"PEMATH"INT 61h 呼叫常駐計算機"PEMATH is not resident" 至標準輸出 (控制代碼 1)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
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)REPE CMPSB 重複比較字串,CX 為計數,ZF=1 時繼續
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),避免硬編碼中斷號,靈活性極高。
MOV BX,SCREEN_HANDLE (1) ; STDOUT
MOV CX,MESSAGE_LEN
LEA DX,MESSAGE
MOV AH,40h ; WRITE
INT 21h
使用檔案控制代碼 1 (標準輸出) 配合 AH=40h 寫入字串,而非 AH=09h (需 $ 結尾)。
ORG 100h:.COM 載入位址偏移CGROUP GROUP CODESEG + ASSUME CS:CGROUP,DS:CGROUP,ES:CGROUP:小模型,單段PUBLIC CALC + END CALC:進入點標號INT 20h:標準 .COM 退出方式| 角色 | 程式 | 功能 |
|---|---|---|
| 常駐核心 | 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)REPE CMPSB 字串比較指令用法MOV BYTE PTR [INT_CODE], AL)AH=40h, BX=1 vs AH=09h, DS:DX=$終止字串ORG 100h、INT 20h 退出CALC.ASM 是 TSR 生態系中「啟動器」的經典實現:掃描中斷向量 → 驗證特徵字串 → 動態構建中斷呼叫 → 錯誤回饋。其核心思想——服務發現、介面契約、動態調用、優雅降級——在現代微服務架構、外掛系統、熱插拔模組中依然是核心設計模式。研讀此碼,可窺見「常駐服務與啟動器分離」架構在 16 位實模式下的極簡本質。