本文收錄經典 DOS 組合語言工具 CLEAR.ASM(Ray Duncan, 1983),功能為清除螢幕並設定字元顯示屬性(正常/反白/底線/閃爍/高亮/靜默)。雖屬歷史產物,但展示了 BIOS 視訊服務 (INT 10h)、命令列解析、位元操作等核心技巧,對理解 x86 實模式程式設計、硬體直接控制仍具教學價值。
CLEAR [選項]
選項:
I - 高亮度
R - 反白顯示
U - 底線
B - 閃爍
S - 靜默模式(無前景/背景,僅清除螢幕)
無參數:以正常屬性(白字黑底)清除螢幕
mov ah, 15
int 10h ; AL = 模式, AH = 欄數
cmp al, 7 ; 模式 7 = 單色文字模式
je clear0
cmp al, 3
ja clear9 ; 圖形模式 (4,5,6) 或非支援模式直接退出
僅支援文字模式 (0-3, 7),圖形模式不處理。
xor cx, cx ; 左上角 (0,0)
mov dh, 24 ; 右下角列 = 24 (第 25 列)
mov dl, ah ; 右下角欄 = BIOS 回傳欄數 - 1
dec dl
mov bh, 7 ; 預設屬性:白字黑底 (07h)
mov si, offset input ; PSP:80h 命令列長度+內容
cld
lodsb ; 取長度
or al, al
jz clear8 ; 無參數
clear1:
lodsb
cmp al, 0dh ; CR 結束
je clear8
or al, 20h ; 轉小寫
cmp al, 'a' / cmp al, 'z' ; 篩選 a-z
jb clear1 / ja clear1
; 各選項對應屬性位元操作
cmp al, 'i' ; 高亮度 bit 3 (08h)
jne clear2
or bh, 08h
jmp clear1
clear2:
cmp al, 'r' ; 反白:清除前景/背景位元,設 070h
jne clear3
and bh, 88h
or bh, 70h
jmp clear1
clear3:
cmp al, 'u' ; 底線:屬性 01h
jne clear4
and bh, 88h
or bh, 01h
jmp clear1
clear4:
cmp al, 'b' ; 閃爍 bit 7 (80h)
jne clear5
or bh, 80h
jmp clear1
clear5:
cmp al, 's' ; 靜默:bh=0,不再處理後續字元
jne clear1
mov bh, 0
屬性位元定義(MDA/CGA 文字模式):
clear8:
mov ax, 0600h ; AH=06 (捲動), AL=0 (捲動行數=0 表示清除整個視窗)
int 10h ; 以 BH 屬性填充視窗
mov ah, 2 ; 設定游標位置
mov bh, 0 ; 頁面 0
xor dx, dx ; (0,0)
int 10h
clear9:
int 20h ; 返回 DOS
INT 10h AH=06h 向上捲動視窗,AL=0 為特殊值:清除整個視窗並用 BH 屬性填充。
name clear
page 55,132
title 'CLEAR --- control PC display'
input equ 080h
cr equ 0dh
cseg segment byte
assume cs:cseg,ds:cseg
org 0100h
clear:
mov ah,15
int 10h
cmp al,7
je clear0
cmp al,3
ja clear9
clear0:
xor cx,cx
mov dh,24
mov dl,ah
dec dl
mov bh,7
mov si,offset input
cld
lodsb
or al,al
jz clear8
clear1:
lodsb
cmp al,cr
je clear8
or al,20h
cmp al,'a'
jb clear1
cmp al,'z'
ja clear1
cmp al,'i'
jne clear2
or bh,08h
jmp short clear1
clear2:
cmp al,'r'
jne clear3
and bh,088h
or bh,070h
jmp short clear1
clear3:
cmp al,'u'
jne clear4
and bh,088h
or bh,01h
jmp short clear1
clear4:
cmp al,'b'
jne clear5
or bh,080h
jmp short clear1
clear5:
cmp al,'s'
jne clear1
mov bh,0
clear8:
mov ax,0600h
int 10h
mov ah,2
mov bh,0
xor dx,dx
int 10h
clear9:
int 20h
cseg ends
end clear
| DOS/實模式 | Win32/保護模式 |
|---|---|
INT 10h BIOS 視訊服務 | GDI / DirectX / 控制台 API (FillConsoleOutputAttribute) |
| 直接操作顯示記憶體 (B800h) | 虛擬記憶體、顯示驅動程式管理 |
| PSP:80h 命令列 | GetCommandLine / __argc/__argv |
| .COM 檔 (ORG 100h) | .EXE (PE 格式) |
| 無保護、單任務 | 記憶體保護、多任務、使用者/核心模式 |
AH=06h, AL=0)ORG 100h、SEGMENT/ENDS、ASSUMECLEAR.ASM 是 DOS 時代系統工具程式的典型代表:體積小(<1KB)、直接操作硬體、充分利用 BIOS 服務、命令列介面簡潔。雖然現代作業系統不再允許應用程式直接呼叫 BIOS 中斷,但其展示的硬體抽象層程式設計思維、位元操作技巧、緊湊代碼風格,仍是組合語言學習者寶貴的歷史資產與技術靈感來源。