📄 008.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 + -