db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,1
db 2ah,238,1,1
db 2ah,238,1,1
char_cnt dw ?
pointer dw ?
line_on db ?
col_on db ?
data ends
stack segment
db 2000 dup (0)
stack ends
code segment
assume cs:code,ds:data
main proc far
push ds
sub ax,ax
push ax
mov ax,data ;初始化DS
mov ds,ax
mov ah,0 ;设置300*200彩色图形方式
mov al,3
int 10h
mov ah,0bh ;设置背景颜色
mov bh,0
mov bl,2
int 10h
mov ah,0bh ;设置彩色调板
mov bh,01
mov bl,00
int 10h
call clear_screen ;清屏
lea di,car ;di指向字符图形表
mov dh,5 ;从第5行第5列位置开始
mov dl,5 ;显示汽车
call move_shape
mov ah,01h ;从键盘输入字符
int 21h
cmp al,0dh
je exit
exit:mov ah,4ch
int 21h
ret
main endp
clear_screen proc near ;清屏子程序
push ax ;保护寄存器
push bx
push cx
push dx
mov ah,6 ;屏幕上卷功能
mov al,6
mov ch,0 ;左上角行号
mov cl,0 ;左上角列号
mov dh,250 ;右下角行号
mov dl,200 ;右下角列号
mov bh,7 ;卷入行属性
int 10h ;调用显示功能
pop dx ;恢复寄存器
pop cx
pop bx
pop ax
ret ;返回主程序
clear_screen endp
move_shape proc near
push ax
push bx
push cx
push dx
push di
mov ah,0fh ;取当前显示方式
int 10h
sub ch,ch ;清除寄存器CX的高字节
mov cl,[di] ;CL放循环次数
inc di ;di指向字符表的第一个字符
mov char_cnt,cx ;保存循环次数
mov pointer,di
mov line_on,dh
mov col_on,dl
plot_next:
add dh,[di+2] ;改变行列指针
add dl,[di+3]
cmp dl,150 ;出屏否?
jb mov_crsr
call erase
pop di
pop dx
pop cx
pop bx
pop ax
ret
mov_crsr:
mov ah,2 ;移动光标位置
int 10h
mov al,[di]
mov bl,[di+1] ;取字符值及属性
push cx
mov cx,1
mov ah,09 ;显示字符
int 10h
pop cx
add di,4 ;di指向下一个字符
loop plot_next
call dly_qrtr ;调用延时子程序
call erase ;调用擦除子程序
jmp short plot_next
move_shape endp
erase proc near ;擦除子程序
mov cx,char_cnt
mov di,pointer
mov dh,line_on
mov dl,col_on
erase_next:
add dh,[di+2]
add dl,[di+3]
mov ah,2
int 10h
mov al,[di]
mov bl,0
push cx
mov cx,1
mov ah,9
int 10h
pop cx
add di,4
loop erase_next
mov cx,char_cnt
mov di,pointer
mov dh,line_on
inc col_on
mov dl,col_on
ret
erase endp
dly_qrtr proc near ;延时子程序
push cx
push dx
mov dx,50000
d11:mov cx,8000
d12:loop d12
dec dx
jnz d11
pop dx
pop cx
ret
dly_qrtr endp
code ends
end main微机原理课程设计_字符图形程序阳泉学院