CLR.ASM 是一個供 BASIC 程式 (如 GW-BASIC、QuickBASIC) 呼叫的組合語言子程式,利用 BIOS 影像服務 (INT 10h AH=06h/07h) 實現文字模式視窗捲動或清除。它展示了高階語言與組合語言混合編程的經典參數傳遞、堆疊幀操作、暫存器保存與 BIOS 介面呼叫技巧。
BASIC 呼叫慣例:參數以**近參考** (Near Reference) 方式傳遞,堆疊上依序存放各參數的**位址** (Offset),呼叫者清理堆疊。子程式宣告 FAR,透過 BP 存取堆疊參數。
; 參數順序 (對應 BASIC CALL CLR(...))
FUNCT ; 功能: 1=捲上(6), 0=捲下(7)
FG_COLR ; 前景色
BG_COLR ; 背景色
LINES ; 捲動行數 (0=清除整個視窗)
ULROW ; 左上列 (1-25)
ULCOL ; 左上行 (1-80)
LRROW ; 右下列
LRCOL ; 右下行
PUSH BP; MOV BP,SP
PUSH DS; PUSH ES
MOV AX,DATASEG; MOV DS,AX
保存呼叫者段暫存器,建立自己的資料段定址。
MOV SI,SS:[BP+6] ; 參數 1 位址
MOV AX,ES:[SI] ; 取值
MOV FUNCT,AX
... 依序取得 8 個參數 ...
使用 SS:[BP+offset] 存取堆疊參數位址,再透過 ES:[SI] 解參考取值 (BASIC 預設 DS=ES=資料段)。
MOV AX,1
SUB LRROW,AX; SUB LRCOL,AX
SUB ULROW,AX; SUB ULCOL,AX
BASIC 畫面座標通常 1-25/1-80,BIOS INT 10h 要求 0-24/0-79。
; 前景色 → AL 低 4 位 (Bit 3=閃爍)
; 背景色 → AH 低 3 位,左移 4 位至 Bit 6-4
; 合成 → ATTRIB
處理閃爍屬性:前景色 >15 時設 Bit 7 (閃爍),清 Bit 6-4。背景色只取低 3 位。最終 OR AL,AH 形成標準屬性位元組。
CMP BL,0; JG F6 ; FUNCT=1 → AH=06h (捲上)
MOV AH,07h; JMP OUT1 ; FUNCT=0 → AH=07h (捲下)
F6: MOV AH,06h
OUT1: MOV CALNU,AH
MOV AL,BL ; LINES (0=清除)
MOV CH,BL ; ULROW
MOV CL,BL ; ULCOL
MOV DH,BL ; LRROW
MOV DL,BL ; LRCOL
MOV BH,BL ; ATTRIB
INT 10H
暫存器對應:AH=功能, AL=行數, CH=起始列, CL=起始行, DH=結束列, DL=結束行, BH=屬性。
POP ES; POP DS; POP BP
RET 16 ; 清除 8 個參數位址 (16 位元組)
| 項目 | 說明 |
|---|---|
| 呼叫慣例 | FAR 程序,參數為近參考 (位址),呼叫者清堆疊 (但這裡 RET 16 由被呼叫者清理) |
| 段暫存器 | DS/ES 需指向 BASIC 資料段以解參考;子程式自建 DATASEG |
| 參數存取 | SS:[BP+6] 起始,每參數 2 位元組 |
| BIOS 介面 | INT 10h AH=06h/07h 捲動/清除視窗 |
| 色彩模型 | 標準 4 位前景 + 3 位背景 + 1 位閃爍 |
| 座標系統 | 轉換 1-based (BASIC) → 0-based (BIOS) |
CLR.ASM 是高階語言擴充組合語言功能的教科書級範例。它處理了參數傳遞、資料轉換、硬體抽象層 (BIOS) 呼叫、暫存器保存/恢復等所有跨語言呼叫必須面對的細節。雖然現代開發環境已極少直接撰寫此類子程式,但理解其運作機制對於除錯混合語言專案、編寫編譯器後端、逆向工程舊版軟體仍具核心價值。