📄 car.asm
字号:
;
;
;
;---------------------------------------------- 动态小车图形设计 ----------------------------------------
;
;
;要求:小车在公路上行驶,从屏幕左侧驶向右侧。在到达屏幕右侧,公路下降一段距离并改变颜色,然后小车继续
;由左向右行驶。当下降到屏幕底端时,又返回屏幕顶部重复上述过程,直到有按键按下。
;
;
;
;源程序如下:
data segment
infor db 0dh,0ah,'input 1 or 2(1:show a car,2:exit):$'
bufa db 200
db ?
db 200 dup(0)
bufb db 200 dup(?)
car db 7; 小汽车的字符图形表
db 52h,7,0,0
db 0b1h,7,0,1
db 0dbh,7,0,1
db 0dbh,7,0,1
db 4fh,7,1,0
db 4fh,7,0,-3
db 2,7,-2,1
char_cnt dw ?
pointer dw ?
line_on db ?
col_on db ?
data ends
stack segment stack
db 200 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
mov ah,0; 设置显示方式为640*350彩色图形方式
mov al,10h
int 10h
lea dx,infor; 在显示器上显示字符串提示信息
mov ah,9
int 21h
mov ah,0;从键盘读取字符到AL寄存器
int 16h
cmp al,31h
jne a
call qiche
sub ax,ax
a : cmp al,32h;比较al是否等于2
jne start
b : mov ah,4ch;终止当前程序并返回调用程序
int 21h
clear macro pch,pcl,pdh,pdl,pbh
;清屏宏定义
mov ah,0
mov al,10h
int 10h
mov ah,6;调用6号功能设置整个屏幕为bh值所对应的属性
sub al,al
mov al,1;设置滚动行数为1
mov ch,pch
mov cl,pcl;窗口左上角(0行,0列)
mov dh,pdh
mov dl,pdl;窗口右下角(24行,79列)
mov bh,pbh;正常属性显示:1绿、2青、3蓝、4红、5粉、6黄、7白(高亮)
int 10h
endm
dly proc near; 延时子程序
push cx
push dx
mov dx,10000
dl1 : mov cx,6801
dl2 : loop dl2
dec dx
jnz dl1
pop dx
pop cx
ret
dly endp
qiche proc near;汽车子程序
mov ah,0
mov al,10h
int 10h
push dx
push bx
cmp ax,ax;zf标志位置1
mov dh,3
mov bh,1
next: cmp dh,25;公路是否退至屏幕底端?
jb next1
sub dh,dh
mov dh,3
next1:
mov ah,01h;检查键盘缓冲区中有无输入字符(zf是否等于0)
int 16h
jne fh;zf等于0则退出程序
clear 0,0,dh,79,bh; 清屏宏调用
lea di,car ;di指向字符图形表
push dx;保护dh源值
call move_shape
pop dx
pop ax
add dh,3
add bh,1
cmp bh,8;循环改变公路的颜色
jb bs
sub bh,bh
mov bh,1
bs: jmp next
fh: ret
qiche endp
move_shape proc near
push ax
push bx
push cx
sub dh,2;从第1行0列位置开始显示汽车
mov dl,0
push dx
push di
mov ah,0fh;取当前显示方式
int 10h
sub ch,ch
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,80;出屏否?
jb mov_crsr
pop di
pop dx
pop cx
pop bx
pop ax
jmp exit2
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
call erase
jmp short plot_next
exit2 : ret
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
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -