源代码:
assume cs:code,ds:data
data segment
DB 080H, 001H, 080H, 001H, 080H, 001H, 0FCH, 03FH, 0FCH, 03FH, 08CH, 031H, 08CH, 031H, 08CH, 031H;
DB 0FCH, 03FH, 0FCH, 03FH, 08CH, 031H, 080H, 001H, 080H, 001H, 080H, 001H, 080H, 001H, 000H, 000H;
DB 1H,2H,4H,8H,10H,20H,40H,80H ;用于过滤 01 10 100 1000 10000 100000 1000000 10000000
data ends
code segment
start:mov ax,data
mov ds,ax ;数据的起始位置
mov ax,0b800h
mov es,ax ;显示数据位置的起始位置
mov bp,0
mov cx,16
move:push cx
;清除每一个“中”字
mov di,0
push di
mov cx,16
clear:push cx
mov cx,32
clearLine:mov byte ptr es:[bp+di+500h],0
inc di
loop clearLine
add di,128
pop cx
loop clear
pop di
mov si,0
add bp,8
;显示每一个“中”字
mov cx,16 ; 大的循环16次
show:push cx ;存储CX
mov cx,2 ;二层循环2次
showByte:push cx
mov bx,20h ;指示用于过滤的数据段
mov ah,[si] ;第一次:080h
mov cx,8 ; 三层循环8次 每个字节自己的每一位进行逆序放置
showBit:push cx
mov dl,ah ;080h传递给dl
mov dh,[bx] ;过滤数据段的第一个数据(1h)传递给dh
and dl,dh ;过滤dl中的第一位,看第一位是否为1
mov cx,0 ; cx 设为0
mov cl,dl ;把结果dl传递给cl,
jcxz e ;cx是否等于0 cx=0,
mov byte ptr es:[bp+di+500h],2ah ;cx!=0 低位*
inc di
mov byte ptr es:[bp+di+500h],14h ;背景蓝字体红
inc di
jmp f
e: mov byte ptr es:[bp+di+500h],0
inc di
mov byte ptr es:[bp+di+500h],0
inc di
f: inc bx
pop cx
loop showBit
inc si
pop cx
loop showByte
add di,128
pop cx
loop show
mov cx,0ffffh
b:
push cx
mov cx,1000h
h:
loop h
pop cx
loop b
pop cx
loop move
mov ax,4c00h
int 21h
code ends
end start
编译链接源程序,用debug运行,执行g命令
就会看到”中"从显示缓存区的左边移动到右边,最终移动的位置如图
注意:如果在编译的过程中出现“jump out of the range by X byte(s)”,是因为loop指令对IP的修改范围是-128到127;X表示超出的字节数;那就必须对loop循环中的指令进行优化以符合规定。