小毛病,汇编高手帮帮忙!!
[b][size=5]题目21:设计一个程序完成如下功能: [/size][/b]初始状态下假设一个字母A或B从屏幕的左下角斜飞出去(速度为每秒钟移动2个字符的位置)
字母在行进期间碰到屏幕的边沿时反弹。
使用小键盘对运动中的字母进行控制,小键盘上的按键如下定义:
· 4、2、6、8对应左、下、右、上
· 1、3、9、7对应左下、右下、右上、左上
比如:按下9键后字母就向右上方向前进
· 程序在按下'ESC'按键时退出。
要求:
· 当字母往前走时必须将前一个字母显示的消除。
· 在程序中必须记住当前字母所在的座标、运行方向。屏幕的座标是:行:0-79,列0-24,运行方向可用一个变量表示,该变量从0-7分别表示左、左下、下、右下、右、右上、上、左上
· 每次向前移时必须判断下一个座标位置,若碰到边界即X、Y是否为(0、79), (0,24)则进行反弹计算,然后改变运行方向变量值。
· 当控制按键按下后除了改变运行方向变量值外还必须判断是否在边界,需要保证下一个字母位置不能有越界的异常情况发生。
MOV NUM,FANGXIANG
CALL CLS
CALL READ
OPR1 COL,COL_NUM
OPR2 ROW,ROW_NUM
ENDM
DATAS SEGMENT
str db 'A'
row db 24
col db 0
NUM DB 5
DATAS ENDS
STACKS SEGMENT
db 200 dup (0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS: DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
call cls
call DISPLAY
LOOP1:
STI
MOV AH,0BH
INT 21H
INC AL
JNZ MOVE1
FLAG3:
MOV AH,0
INT 16H
PUSH AX
MOV AH,1
INT 16H
JZ FLAG2
POP AX
JMP FLAG3
EXIT1:
JMP EXIT
FLAG2:
POP AX
CMP AL,1BH
JZ EXIT
CMP AH,4BH
JZ K4
CMP AH,50H
JZ K2
CMP AH,4DH
JZ K6
CMP AH,48H
JZ K8
CMP AH,47H
JZ K7
CMP AH,49H
JZ K9
CMP AH,4FH
JZ K1
CMP AH,51H
JZ K3
JMP LOOP1
K4:
FANGX 5,SUB,ADD,1,0
CALL DISPLAY
JMP LOOP1
K2:
FANGX 4,ADD,ADD,0,1
CALL DISPLAY
JMP LOOP1
K6:
FANGX 7,ADD,ADD,1,0
CALL DISPLAY
JMP LOOP1
K8:
FANGX 3,ADD,SUB,0,1
CALL DISPLAY
JMP LOOP1
K7:
FANGX 6,SUB,SUB,1,1
CALL DISPLAY
JMP LOOP1
K9:
FANGX 5,ADD,SUB,1,1
CALL DISPLAY
JMP LOOP1
K1:
FANGX 1,SUB,ADD,1,1
CALL DISPLAY
JMP LOOP1
K3:
FANGX 2,ADD,ADD,1,1
CALL DISPLAY
JMP LOOP1
MOVE1:
CALL SUB_DELAY
CALL MOVE
JMP LOOP1
EXIT:
MOV AX,4C00H
INT 21H ;返回DOS
DISPLAY proc near ;显示字符'A'
MOV BH,0
MOV DH,ROW
MOV DL,COL
MOV AH,2
INT 10H
mov cx,1
mov al,'A'
MOV BL,00001011B
mov ah,9
int 10h
ret
DISPLAY endp
CLS PROC NEAR ;清屏
MOV CX,0
MOV DH,24
MOV DL,79
MOV BH,0
MOV AX,600H
INT 10H
RET
CLS ENDP
MOVE PROC NEAR ;运动
STI
NEXT:
MOV BL,NUM
CMP NUM,5
JZ ROT1
CMP NUM,2
JZ ROT2
CMP NUM,6
JZ ROT3
CMP NUM,1
JZ ROT4
;CALL SUB_DELAY
FANGX BL,ADD,SUB,1,1
CALL DISPLAY
JMP NEXT_MOVE
ROT1: ;右上
CMP ROW,0
JZ ROT2 ;向右下动
CMP COL,79
JZ ROT3 ;向左上动
;CALL SUB_DELAY
FANGX 5,ADD,SUB,1,1
CALL DISPLAY
JMP NEXT_MOVE
ROT2: ;右下
CMP COL,79
JZ ROT4 ;向左下动
CMP ROW,24
JZ ROT1 ;向右上动
;CALL SUB_DELAY
FANGX 2,ADD,ADD,1,1
CALL DISPLAY
JMP NEXT_MOVE
ROT3: ;左上
CMP COL,0
JZ ROT1 ;向右上动
CMP ROW,0
JZ ROT4
;CALL SUB_DELAY
FANGX 6,SUB,SUB,1,1
CALL DISPLAY
JMP NEXT_MOVE
ROT4: ;左下
CMP ROW,24
JZ ROT3
CMP COL,0
JZ ROT2
;CALL SUB_DELAY
FANGX 1,SUB,ADD,1,1
CALL DISPLAY
JMP NEXT_MOVE
NEXT_MOVE:
RET
MOVE ENDP
READ PROC NEAR ;读光标位置,DH=行号,DL=列号
MOV AH,3
MOV BH,0
INT 10H
MOV ROW,DH
MOV COL,DL
RET
READ ENDP
SUB_DELAY PROC NEAR ;延迟一秒
STI
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSHF
MOV AH, 2CH
INT 21H
INC DH ;系统秒数个数加1
MOV BL, DH
CMP BL, 3CH ;如果是60
JNE SUB_TIMER
XOR BL, BL ;BL置0
SUB_TIMER:
MOV AH, 2CH
INT 21H ;获取系统时间
CMP BL, DH ;秒数十位置0,只比较个数
JE SUB_RET ;如果到了下一秒,则返回
JMP SUB_TIMER
SUB_RET: POPF
POP DX
POP CX
POP BX
POP AX
RET
SUB_DELAY ENDP
CODES ENDS
END START 这是我写的程序
有点小毛病的~~
就是在A运动到最上面的时候不反弹。。。
而且,按2.4.6.8的时候,应该按照原来运动方向运动的,它都是向右上运动。。。
还有就是,按了控制键后,运动改变不明显。。。例如我按了2,不是向下运动的。。。 顶哦~~~
页:
[1]
