在 DOS 時代,利用 VGA 320×200 256 色模式(Mode 13h)配合自訂字型繪製動畫,是組合語言入門的經典專題。本文完整解析一個僅 1KB 的 .EXE 動畫程式:四幀 8×8 字元合成的「跑動小人」,巧用 LOOP 延時與字型重定向實現流暢動畫,無需系統計時器中斷。
; 設定 Mode 13h (320x200x256)
mov ah, 0
mov al, 13h
int 10h
; 設定調色盤:背景藍、前景黃
mov ah, 10h
mov bh, 1
mov bl, 0 ; 背景色索引
int 10h
mov bh, 0
mov bl, 1 ; 前景色索引
int 10h
將四組 32 字元(每組 8×8=64 位元組,共 256 位元組)的點陣資料 boyd 設為中斷向量 1Fh(系統字型 80h-FFh 對應),使 INT 10h AH=09h 直接繪製這些字元。
mov al, 1Fh
mov dx, offset boyd
mov ah, 25h
int 21h
每幀 32 字元(80h-9Fh, A0h-BFh, C0h-DFh, E0h-FFh),每字元 8 位元組(8 掃描列),共 256 位元組/幀。資料以十六進位位元組陣列定義,例如:
; Frame 1 片段
db 0,1,7,31,4 dup(63) ; 字元 82h
db 120,252,244,240,240,240,176,176 ; 字元 83h
frame1:
mov ascii, 80h ; 起始字元碼
mov frame, 1
startfr:
sub dx, dx ; DH=行, DL=列 (0,0)
drawchar:
mov ah, 2 ; 設定游標位置
mov bh, 0
int 10h
mov ah, 9 ; 寫入字元屬性
mov cx, 1 ; 重複 1 次
mov bl, 03h ; 屬性:黃前景(3) 藍背景(0) → 03h
mov al, ascii
int 10h
inc ascii
inc dl
cmp dl, 3
jna drawchar ; 寬 3 字元
mov dl, 0
inc dh
cmp dh, 3
jna drawchar ; 高 3 字元
call delay ; 簡易延時
inc frame
cmp frame, 4
jna startfr ; 4 幀循環
frame 切換 4 幀,內層 DH/DL 掃描 3×3 字元區塊(實際顯示 24×24 像素)。BL=03h 同時設定前景/背景色,CX=1 單字元輸出。delay 使用 MOV CX,10000 / LOOP $ 空迴圈,視 CPU 速度調整流暢度。; 檢查鍵盤狀態 (INT 21h AH=0Bh)
mov ah, 0Bh
int 21h
cmp al, 0FFh
jne frame1 ; 無鍵則繼續動畫
; 回復文字模式 80x25
xor dx, dx
xor bp, bp
mov ax, 3
int 10h
; 顯示個人資訊 (INT 10h AH=13h 字串輸出)
mov bp, offset out_char
mov cx, len_str
mov dh, 0
mov dl, 33
mov al, 1
mov bl, 0Eh
mov ah, 13h
int 10h
; TASM 5.0 / MASM 5.0 均可
tasm boy.asm
tlink /t boy.obj
boy.exe
.EXE 僅 1KB,展示組合語言的空間效率。INT 21h AH=25h 覆寫系統字型向量,無需直接操作顯存。INT 10h AH=09h)繪製像素級動畫,簡化座標計算。INT 1Ah 計時器實現固定幀率(如 18.2Hz → 約 10 FPS)。INT 10h AH=0Ch 直接寫入顯存。INT 16h)實現互動移動。這個小程式雖簡單,卻串聯了視訊模式設定、調色盤控制、字型重定義、文字模式圖形輸出、軟體延時與模式切換等核心技能,是組合語言圖形程式設計的完美入門範例。