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

📄 008.txt

📁 这是一个汇编语言写的课程设计
💻 TXT
字号:
Pushr		macro	x,y,z,w
			Push		x
			Push		y
			Push		z
			Push		w
			Endm
;堆栈顶数据弹出到寄存器宏定义
Popr		macro	x,y,z,w
			Pop		w
			Pop		z
			Pop		y
			Pop		x
Endm                           
;定义堆栈段
Stacks       segment
			Dw  256 dup(?)
Stacks       ends
;定义数据段
DATA   SEGMENT
INFO1  DB 0DH,0AH,'Input 1,2,OR 3:(1:Lovers,2:Car,3:Exit) $'
INFO2  DB 0dh,0ah,'                                     Be Careful!$'
INFO3  DB 0dh,0ah,'                          Love like mountain climbing, tired!$'
BUFA   DB 200
       DB ?
       DB 200 DUP(0)
BUFB   DB 200 DUP(?)
Lovers		db	16                             ;情侣由16个符号组成
			Db	0d9h,0Fh,0,0           ;左手,字符属性,行偏移,列偏移
			DB	0dbh,0ah,0,1           ;身体,字符属性,行偏移,列偏移
			Db	0c0h,0fh,0,1           ;右手,字符属性,行偏移,列偏移
			Db	0feh,06h,1,-1          ;腿,字符属性,行偏移,列偏移
			Db	0fch,06h,1,0           ;脚,字符属性,行偏移,列偏移
			Db	01h,0eh,-3,0           ;头,字符属性,行偏移,列偏移
			Db	0ch,04h,-1,0           ;帽子,字符属性,行偏移,列偏移
	                Db	03h,0fch,0,2           ;红心,字符属性,行偏移,列偏移
                        Db	03h,0fch,-2,0          ;红心,字符属性,行偏移,列偏
                        Db	02fh,0fh,4,1           ;左手,字符属性,行偏移,列偏移
			Db	01eh,0ah,0,1           ;身体,字符属性,行偏移,列偏移
			Db	05ch,0fh,0,1           ;右手,字符属性,行偏移,列偏移
			Db	0feh,06h,1,-1          ;腿,字符属性,行偏移,列偏移
			Db	0efh,06h,1,0           ;脚,字符属性,行偏移,列偏移
			Db	02h,0eh,-3,0           ;头,字符属性,行偏移,列偏移
			Db	0eh,04h,-1,0           ;帽子,字符属性,行偏移,列偏移
CAR             DB      7                              ;小汽车由7个符号组成
                        DB      52H,0ah,0,0            ;车的后面 ,字符属性,行偏移,列偏移         
                        DB      0B1H,4,0,1             ;车身,字符属性,行偏移,列偏移
                        DB      0DBH,5,0,1             ;车的前面,字符属性,行偏移,列偏移
                        DB      0DBH,5,0,1             ;车的前面,字符属性,行偏移,列偏移
                        DB      4FH,7h,1,0             ;轮子 ,字符属性,行偏移,列偏移
                        DB      4FH,7h,0,-3            ;轮子,字符属性,行偏移,列偏移
                        DB      2,0fh,-2,1            ;人头,字符属性,行偏移,列偏移
Count		        dw	0                      ;保存字符个数
Pointer		        dw	0                      ;保存字符首地址
Line		        db	0                      ;保存行号         
Column		        db	0                      ;保存列号
CHAR_CNT                DW      0                      ;保存字符个数
POINTER1                DW      0                      ;保存字符首地址
LINE_ON                 DB      0                      ;保存行号
COL_ON                  DB      0                      ;保存列号
DATA           ENDS

CODE   SEGMENT
       ASSUME CS:CODE,DS:DATA,SS:Stacks
start:                  mov             ax,data
                        mov             ds,ax
                        mov	        ah,0           ;设置为80×25彩色文本方式
                        mov             al,3
                        int             10h
                        Call	 	clear
                        lea             dx,INFO1       ;在显示器上显示字符串提示信息        
                        mov             ah,9
                        int             21h
                        mov             ah,0           ;从键盘读取字符到AL寄存器
                        int             16h 
                        CMP             AL,31H         ;比较AL是否等于1 
                        JNE              A
                        CALL            xue            ;调用情侣子程序
       A:               CMP             AL,32H         ;比较AL是否等于2           
                        JNE             B
                        CALL            feng           ;调用汽车子程序 
       B:               CMP             AL,33H         ;比较AL是否等于3
                        JNE             START
                        MOV             AH,4CH         ;终止当前程序并返回
                        INT             21H

xue            proc      near                          ;xue的子程序<情侣>
                        PUSH            AX
                        PUSH            BX
                        PUSH            CX
                        PUSH            DX     
                        mov	        ah,0           ;设置为80×25彩色文本方式
                        mov             al,3
                        int             10h
                        Call	 	clear  
                        lea             dx,INFO3       ;在显示器上显示字符串INFO3      
                        mov             ah,9
                        int             21h    
                        Lea		di,Lovers       ;数据段首地址送DI
			Mov		dx,1a00h       ;显示的起始行号和列号
		        Mov		bh,0
                        Call            moves          ;调用moves子程序
                        ret 
xue        endp
feng           proc      near                          ;feng的程序<汽车> 
                        PUSH            AX
                        PUSH            BX
                        PUSH            CX
                        PUSH            DX     
                        mov	        ah,0           ;设置为80×25彩色文本方式
                        mov             al,3
                        int             10h
                        Call	 	clear
                        lea             dx,INFO2       ;在显示器上显示字符串INFO2     
                        mov             ah,9
                        int             21h
                        LEA             DI,CAR         ;DI指向字符图形表
                        Mov	        dx,0100h       ;显示的起始行号和列号
                        Mov		bh,0
                        CALL            MOVE_SHAPE     ;调用MOVE_SHAPE子程序
feng       endp
MOVE_SHAPE     PROC      NEAR                          ;MOVE_SHAPE子程序
                        PUSH             AX
                        PUSH             BX
                        PUSH             CX
                        PUSH             DX
                        PUSH             DI
                        MOV              AH,0FH         ;取当前显示方式
                        INT              10H
                        SUB              CH,CH
                        MOV              CL,[DI]        ;CL放字符个数
                        INC              DI             ;DI指向字符图形表中的第一个字符
                        MOV              CHAR_CNT,CX
                        MOV              POINTER1,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             delay
                        CALL             ERASE1
                        JMP              SHORT PLOT_NEXT
exit2: ret    
MOVE_SHAPE              ENDP
ERASE1       PROC        NEAR                           ;ERASE1子程序
                        MOV              CX,CHAR_CNT    ;字符个数送CX 
                        MOV              DI,POINTER1    ;字符首地址送DI
                        MOV              DH,LINE_ON     ;行号送DH
                        CMP              DH,22          ;判断是否到坡底
                        JLE              AA
                        DEC              LINE_ON
           AA:          INC              LINE_ON
                        MOV              DL,COL_ON       ;列号送DL
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,POINTER1 
                        MOV              DH,LINE_ON      ;行号送DH
                        INC              COL_ON
                        MOV              DL,COL_ON       ;列号送DL
                        RET
ERASE1                  ENDP

Moves		proc                                     ;情侣移动子程序
			Pushr	        ax,bx,cx,dx      ;保存寄存器内容
			Push		di          
			Xor		ch,ch
			Mov		cl,[di]          ;字符个数送CX
			Inc		di               ;指向第一个显示符号
			Mov		count,cx         ;保存字符个数
			Mov		pointer,di       ;保存字符首地址
			Mov		line,dh          ;保存行号
			Mov		column,dl        ;保存列号
Next:                   add             dh,[di+2]        ;根据偏移值计算下一个符号的行号
			Add		dl,[di+3]        ;计算列号
			Cmp		dl,80            ;判断是否到屏幕最右端
			Jb		write            ;否,继续画
			Pop		di
			Popr		ax,bx,cx,dx
			Ret

Write:                  mov             ah,2         
			Int		10h              ;设置光标位置
			Mov		al,[di]          ;取字符
			Mov		bl,[di+1]        ;取字符属性
			Push		cx               ;保存计数值
			                                 ;设置写彩色字符
                        mov             ah,9         
                        mov             cx,1
                        int             10h

			Pop		cx                ;恢复计数值
			Add		di,4              ;指向下一个显示字符
			Loop	        next              ;情侣没画完转next
                        Call            delay             ;延时子程序
                        Call            Erase             ;清除情侣子程序
			Jmp		short next
Moves		endp
			
Erase		proc
			Mov		cx,count          ;字符个数送CX
			Mov		di,pointer        ;字符首地址送DI
			Mov		dh,line           ;行号送DH
                        CMP             DH,4              ;判断是否走到合适地方
                        JG              BB
                        INC             line 
              BB:       DEC             line 
			Mov		dl,column         ;列号送DL
l:			add		dh,[di+2]         ;根据相对偏移计算行号
                        mov             ah,2              ;设置光标位置
                        add             dl,[di+3]
                        int             10h      
			mov		al,[di]           ;取字符     
			mov		bl,0              ;字符属性为黑底黑字
			push		cx            
			mov     	ah,9              ;写字符
                        mov             cx,1           
                        int             10h
			pop		cx
			add		di,4              ;指向下一个字符
			loop		l                 ;未清除完转l
			mov		cx,count          ;为重画情侣做准备
			mov		di,pointer  
			mov		dh,line
			inc		column
			mov		dl,column
			ret
Erase		endp

delay		proc                                       ;延时子程序<1>
			pushr	        ax,bx,cx,dx
                        mov             dx,15000
go:                     mov             cx,5000
repeat:		        loop		repeat
			dec		dx
			jne		go
			popr		ax,bx,cx,dx
			ret
delay		endp

clear			proc                               ;清屏幕子程序<1>
			pushr	        ax,bx,cx,dx
			mov		bh,7
			mov		dx,184fh
			mov     	ax,0600h
                        mov             cx,0
                        int             10h
			popr		ax,bx,cx,dx
			ret
clear			endp

CODE ENDS 
     END        start

⌨️ 快捷键说明

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