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

DOS 時代組合語言經典原始碼賞析:CLEAR 螢幕清除與屬性設定工具

     編輯:組合語言

前言

本文收錄經典 DOS 組合語言工具 CLEAR.ASM(Ray Duncan, 1983),功能為清除螢幕並設定字元顯示屬性(正常/反白/底線/閃爍/高亮/靜默)。雖屬歷史產物,但展示了 BIOS 視訊服務 (INT 10h)、命令列解析、位元操作等核心技巧,對理解 x86 實模式程式設計、硬體直接控制仍具教學價值。

程式功能與用法

CLEAR [選項]
選項:
  I  - 高亮度
  R  - 反白顯示
  U  - 底線
  B  - 閃爍
  S  - 靜默模式(無前景/背景,僅清除螢幕)
無參數:以正常屬性(白字黑底)清除螢幕

核心技術解析

1. 取得當前視訊模式

mov ah, 15
int 10h          ; AL = 模式, AH = 欄數
cmp al, 7        ; 模式 7 = 單色文字模式
je clear0
cmp al, 3
ja clear9        ; 圖形模式 (4,5,6) 或非支援模式直接退出

僅支援文字模式 (0-3, 7),圖形模式不處理。

2. 設定捲動視窗範圍

xor cx, cx       ; 左上角 (0,0)
mov dh, 24       ; 右下角列 = 24 (第 25 列)
mov dl, ah       ; 右下角欄 = BIOS 回傳欄數 - 1
dec dl
mov bh, 7        ; 預設屬性:白字黑底 (07h)

3. 解析命令列參數

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 文字模式):

  • Bit 0-2:前景色
  • Bit 3:高亮度
  • Bit 4-6:背景色
  • Bit 7:閃爍

4. BIOS 捲動服務清除螢幕

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 屬性填充。

完整原始碼 (NASM/MASM 相容)

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 格式)
無保護、單任務記憶體保護、多任務、使用者/核心模式

學習重點

  • BIOS 中斷服務的呼叫慣例與暫存器用法
  • 位元級屬性操作(AND/OR 清除/設定特定位)
  • 命令列字串解析邏輯(長度前綴、大小寫轉換、字元篩選)
  • 捲動中斷清除螢幕的巧妙用法(AH=06h, AL=0)
  • 實模式分段定址:ORG 100h、SEGMENT/ENDS、ASSUME

總結

CLEAR.ASM 是 DOS 時代系統工具程式的典型代表:體積小(<1KB)、直接操作硬體、充分利用 BIOS 服務、命令列介面簡潔。雖然現代作業系統不再允許應用程式直接呼叫 BIOS 中斷,但其展示的硬體抽象層程式設計思維、位元操作技巧、緊湊代碼風格,仍是組合語言學習者寶貴的歷史資產與技術靈感來源。

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