assume cs:code
data segment
DB 002H,000H,012H,000H,002H,000H,012H,010H,002H,010H,022H,030H,07FH,0F8H,062H,0C0H
DB 042H,010H,0A3H,000H,042H,011H,02EH,008H,042H,010H,022H,008H,042H,010H,021H,0F8H
DB 07FH,0F0H,024H,000H,002H,000H,004H,000H,002H,001H,0FFH,0F8H,002H,000H,004H,000H
DB 002H,000H,004H,000H,002H,000H,004H,000H,000H,000H,000H,000H,000H,000H,000H,000H
db 512 dup(0)
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
mov di,64 ;空內存段的首地址
mov cx,64 ;data段總共32個字節
s: mov al,ds:[si]
call change
inc si
loop s
mov di,64 ;轉化後的數據填充到內存段的首地址
call show
mov ax,4c00h
int 21h
;名稱:change
;功能:利用移位的原理(利用標誌寄存CF位)將每個字節的八位提取出來,放到ds:[di]
;參數:ds:[si]=字符串首地址,ds:[di]=轉化後數據存放的地址
change: push cx
mov cx,8
chgs: shl al,1
pushf
pop bx
and bx,00000001b
mov ds:[di],bl
inc di
loop chgs
pop cx
ret
;名稱:show
;功能:按字節顯示字符,當爲0時顯示*,當爲1時顯示笑臉
;參數:ds:[di]指向字符串首地址
show:push ax
push cx
push si
mov ax,0b800h
mov es,ax
mov bx,5*160
mov si,2*10
mov cx,16 ;總共16行
shows0: push cx
mov cx,32 ;總共32列
shows1:mov al,ds:[di]
cmp al,1
jne next
mov byte ptr es:[bx+si],03h;爲1則將此處變爲紅心
mov byte ptr es:[bx+si+1],04h
inc di
add si,2
loop shows1
add bx,160
mov si,2*10
pop cx
loop shows0
next: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
code ends
end start