⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 car.asm

📁 汇编语言动态小车图形设计 小车在公路上行驶
💻 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 + -