;思路分析:將提取到的十六進制字節型字模數據均除以2
;放到內存段轉化成二進制
;1.主程序 2.除法子程序div2 3.顯示子程序show
;ps:每個段的長度不超過64kB,字模提取時行列改變時代碼中需改變的位置爲(1)(2)(3)(4)(5)
assume cs:code
data segment
DB 000H,000H,000H,01CH,00EH,000H,022H,011H,000H,041H,020H,080H,040H,0C0H,040H,040H
DB 000H,040H,040H,000H,040H,020H,000H,080H,010H,001H,000H,008H,002H,000H,004H,004H
DB 000H,002H,008H,000H,001H,010H,000H,000H,0A0H,000H,000H,040H,000H,000H,000H,000H
db 512 dup(0)
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
mov di,48 ;(1)空內存段的首地址
mov cx,48 ;(2)data段字節總數
s: mov al,ds:[si]
mov ah,0
mov bl,2
call div2
inc si
loop s
mov cx,6 ;顏色循環次數
color:mov di,48 ;(3)轉化後的數據填充到內存段的首地址
mov dl,04h
call show1
call delay
mov di,48
mov dl,02h
call show1
call delay
mov di,48
mov dl,01h
call show1
call delay
loop color
mov ax,4c00h
int 21h
;名稱:div2
;功能:將16進制轉化成二進制數放到內存段中
;參數:ds:[si]指向字符串首地址,ds:[di]指向餘數存放的首地址
div2: push cx
push dx
mov cx,8
div2s0:div bl
mov dl,al ;商暫存於dl中
mov al,0
push ax ;餘數入棧
mov al,dl ;上次除法的商恢復到ax中
loop div2s0
mov cx,8
div2s1: pop ax
mov ds:[di],ah ;餘數放入內存段中
inc di
loop div2s1
pop dx
pop cx
ret
;名稱:show1
;功能:按字節顯示字符,當爲0時顯示*,當爲1時顯示笑臉
;參數:ds:[di]指向字符串首地址,dl=顏色
show1:push ax
push cx
push si
mov ax,0b800h
mov es,ax
mov bx,5*160
mov si,2*10
mov cx,16 ;(4)顯示的行數
shows0: push cx
mov cx,3*8 ;(5)顯示的列數
shows1:mov al,ds:[di]
cmp al,1
jne next1
mov byte ptr es:[bx+si],03h;爲1則將此處變爲紅心
mov byte ptr es:[bx+si+1],dl
inc di
add si,2
loop shows1
add bx,160
mov si,2*10
pop cx
loop shows0
next1:mov byte ptr es:[bx+si],0 ;爲0則將此處變爲0
inc di
add si,2
loop shows1
add bx,160
mov si,2*10
pop cx
loop shows0
pop si
pop cx
pop ax
ret
delay:push cx
mov cx,2fffh
s0:push cx
mov cx,2fffh
s1: nop
loop s1
pop cx
loop s0
pop cx
ret
code ends
end start