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

📄 13_o.asm

📁 多种汇编语言程序设计案例
💻 ASM
字号:
 data_seg    segment
 car         db 29
             db 40h,0bh,0,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,00h,0,1
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
;--------------------------------------
  jeep       db 28      
             db 40h,0bh,0,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 40h,0bh,1,0
             db 02ah,0bh,-1,-1
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
             db 02ah,0bh,-1,0
 char_cnt    dw ?
 pointer     dw ?
 line_on     db ?
 col_on      db ?
 char0       db ?
 char1       db ?
 count_cx    dw ?
 count_cx1   dw ?
 count_cx2   dw ?
 data_seg    ends
 ;---------------------------------------
 code_seg    segment
             assume cs:code_seg,ds:data_seg
 main        proc  far
             push  ds
             sub   ax,ax
             sub   cx,cx
             push  ax
             push  cx
             mov   ax,data_seg
             mov   ds,ax

             mov   count_cx,30  
             mov   count_cx1,3 
             mov   count_cx2,9 
             mov   char1,2
again:       
             lea   di,car
             mov   dh,3
             mov   dl,2
             call  move_shape
again1:      lea   di,car
             mov   dh,3
             mov   dl,4
             call  must_2
             dec   count_cx
             jne   again1
             lea   di,car
             mov   dh,3
             mov   dl,2
             mov   char1,2
             call  must_21
   ;-------------------------------------
             mov   count_cx,30  
             mov   count_cx1,3 
             mov   count_cx2,9 
             mov   char1,2
             lea   di,jeep
             mov   dh,3
             mov   dl,77
             call  move_shape
again2:      lea   di,jeep
             mov   dh,3
             mov   dl,75
             call  must_2
             dec   count_cx
             jne   again2
             lea   di,jeep
             mov   dh,3
             mov   dl,77
             mov   char1,2
             call  must_21
             pop   cx
             ret
 main        endp
 ;----------------------------
 clear_screen proc near
             push   ax
             push   bx
             push   cx
             push   dx
             mov    ah,6
             mov    al,0
             mov    ch,0
             mov    cl,0
             mov    dh,24
             mov    dl,79
             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
                mov  cl,[di]
                inc  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  char_cnt,28
             je   exitr1
             cmp  dl,78
             jb   mov_crsr
             jmp  exitr2
 exitr1:     cmp  dl,1
             ja   mov_crsr
 exitr2:     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
             loop plot_next
             call dly_qrtr
             cmp  char_cnt,28
             je   exitr3
             cmp  dl,3
             je   exit3
             cmp  dl,5
             je   exit3
             cmp  dl,77
             je   exit3
             dec  count_cx1  
             je   exit2
             call erase
             jmp  exit3
 exit2:      mov  count_cx1,3
 exit3:      add        col_on,2
             mov        dl,col_on
             mov        cx,char_cnt
             mov        di,pointer
             mov        dh,line_on
             jmp  short plot_next
 exitr3:
             cmp  dl,76
             je   exit3r
             cmp  dl,74
             je   exit3r
             cmp  dl,2
             je   exit3r
             dec  count_cx1  
             je   exit2r
             call erase
             jmp  exit3r
 exit2r:     mov  count_cx1,3
 exit3r:     sub        col_on,2
             mov        dl,col_on
             mov        cx,char_cnt
             mov        di,pointer
             mov        dh,line_on
             jmp        plot_next
 move_shape  endp
  ;----------------------------------------
 must_2       proc near
                push ax
                push bx
                push cx
                push dx
                push di
                mov  ah,0fh
                int  10h
                sub  ch,ch
                mov  cl,[di]
                inc  di
                mov  char_cnt,cx
                mov  pointer,di
                mov  line_on,dh
                mov  col_on,dl

                mov  char0,dl
                mov  count_cx2,9
plot_next1:
             add  dh,[di+2]
             add  dl,[di+3]
             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
             loop plot_next1
;---------------------------------
             dec  count_cx2
             je   exit21
             cmp  char_cnt,28
             je   exitr4
             add  char0,8
             jmp  exitr5
 exitr4:     sub  char0,8
 exitr5:     mov        dl,char0
             mov        cx,char_cnt
             mov        di,pointer
             mov        dh,line_on
             jmp        plot_next1
 exit21:     
             cmp        char_cnt,28
             je         exitr9
             cmp        col_on,12
             je         exit1
             jmp        exit9r
 exitr9:     cmp        col_on,67
             je         exit1
 exit9r:     dec        char1 
             mov        count_cx2,9
             call       dly_qrtr
             call       dly_qrtr
             call       dly_qrtr
             call       erase      
             inc        char1
             mov  count_cx2,9
             jmp  plot_next1
exit1:       pop  di
             pop  dx
             pop  cx
             pop  bx
             pop  ax
             ret
 
 must_2      endp
;-------------------------------------
 must_21     proc near
                push ax
                push bx
                push cx
                push dx
                push di
                mov  ah,0fh
                int  10h
                sub  ch,ch
                mov  cl,[di]
                inc  di
                mov  char_cnt,cx
                mov  pointer,di
                mov  line_on,dh
                mov  col_on,dl
plot_next2:
             add  dh,[di+2]
             add  dl,[di+3]
             cmp  char_cnt,28
             je   exitr6
             cmp  dl,78
             jb   mov_crsr2
             jmp  exit6r
 exitr6:     cmp  dl,1
             ja   mov_crsr2
 exit6r:     call erase
             pop  di
             pop  dx
             pop  cx
             pop  bx
             pop  ax
             ret
 mov_crsr2:
             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
             loop plot_next2
             call dly_qrtr
             call dly_qrtr
             call dly_qrtr
             call dly_qrtr
             call erase
             jmp  short plot_next2
 must_21     endp
;----------------------------------------
 erase       proc       near
             mov        cx,char_cnt
             mov        di,pointer
             mov        dh,line_on
             mov        dl,col_on
             mov        char0,dl
erase_next:
             add        dh,[di+2]
             add        dl,[di+3]
             mov        ah,2
             int        10h
             mov        al,'*'
             mov        bl,0
             push       cx
             mov        cx,1
             mov        ah,9
             int        10h
             pop        cx
             add        di,4
             loop       erase_next

             cmp        char1,1
             jne        exit31
             dec        count_cx2
             je         exit31
             cmp        char_cnt,28
             je         exitr7
             add        char0,8
             jmp        exit7r
 exitr7:     sub        char0,8
 exit7r:     mov        dl,char0
             mov        cx,char_cnt
             mov        di,pointer
             mov        dh,line_on
             jmp        erase_next

 exit31:     cmp        char_cnt,28
             je         exitr8
             inc        col_on
             jmp        exit8r
 exitr8:     dec        col_on
 exit8r:     mov        cx,char_cnt
             mov        di,pointer
             mov        dh,line_on
             mov        dl,col_on
             mov        char0,dl
 exit:       ret
 erase       endp
;----------------------------------------------
;-----------------------------------------
 dly_qrtr    proc       near
             push       cx
             push       dx
             mov        dx,25
 dll:        mov        cx,65530
 dl2:        loop       dl2
             dec        dx
             jnz        dll
             pop        dx
             pop        cx
             ret
 dly_qrtr    endp
 ;---------------------------------------
 code_seg    ends
             end    main
 ;---------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -