这是我编的一道秒表显示的程序,理论上应该没错,我知道就差一点了,但就是调不出来,老显示溢出,我想可能是PUSH和POP没用好的问题,望有高手能帮忙看看,新人感激不尽.......
其功能是按一下空格秒表开始计数,再按一下空格则暂停,再按空格则继续计数,按ESC返回DOS。
DATA SEGMENT
BUF DB '0','0',3AH,'0','0','$'
DATA ENDS ;段定义结束
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START:
MOV AX,DATA ;DS初始化
MOV DS,AX
;================================================================
MOV AH,0BH ;判断有无键输入
INT 21H
CMP AL,0FFH
JE BEGIN ;若有,则跳到BEGIN
PUSH2: CALL DISPLAY1 ;若无,则显示BUF内容
BEGIN:
MOV AH,7 ;输入一个按键
INT 21H
CMP AL,20H
JE PROCESS ;若是空格,则跳转到PROCESS开始计数
CMP AL,1BH
JE EXIT ;若是ESC,则跳转到EXIT返回DOS
JMP BEGIN ;循环判断输入按键
;=================================================================
EXIT: ;返回DOS
MOV AH,4CH
INT 21H
;=================================================================
PROCESS:
MOV AX,0000H ;寄存器清零
MOV BX,0000H
MOV CX,0000H
MOV DX,0000H
PUSH AX ;堆栈保护
PUSH BX
PUSH CX
PUSH DX
;=================================================================
DELAY:
MOV BX,0A4H ;延时10MS子程序
LP2: MOV CX,0FFFFH
LP1: NOP
LOOP LP1
DEC BX
MOV CX,BX
LOOP LP2
;=================================================================
POP DX ;寄存器出栈
POP CX
POP BX
POP AX
INC CX ;CX中存毫秒,加一
PUSH CX ;保存加一后的值
CMP CX,100 ;判断是否计到99毫秒
JB HAOMIAO ;若没有则跳转到HAOMIAO将其值转换
MOV CX,0000H ;若计到100毫秒,清0
INC BX ;BX中存秒值,加一
PUSH BX ;保存加一后的值
CMP BX,60 ;判断是否计到60秒
JE PROCESS ;若是则返回到PROCESS重新开始计时
MOV AX,BX ;若没有计到60秒,则将BX值转换为16进制用于显示
MOV BL,10
DIV BL ;BX值除以10
MOV BX,AX
MOV AH,BL ;商
OR AH,30H
MOV AL,BH ;余数
OR AL,30H
JMP LOAD ;将秒值装入BUF数据段中
CALL DISPLAY1 ;显示BUF数据段内容
JMP DELAY ;继续计时
HAOMIAO:
MOV DX,CX
MOV CL,10
DIV CL ;CX值除以10
MOV CX,DX
MOV DH,CL ;商
OR DH,30H
MOV DL,CH ;余数
OR DL,30H
JMP LOAD ;将毫秒值装入BUF数据段中
LOAD: ;装载要显示的值
MOV BUF,AH
MOV BUF+1,AL
MOV BUF+3,DH
MOV BUF+4,DL
CALL DISPLAY1 ;调用显示子程序
MOV AH,0BH ;判断有无键输入
INT 21H
CMP AL,0FFH
JE PUSH1 ;若有,则跳转到PUSH1
JMP DELAY ;若无,则继续计时
;=================================================================
PUSH1:
MOV AH,7 ;输入一按键
INT 21H
CMP AL,20H
JE PUSH2 ;若是空格,则跳转到PUSH2,计时暂停
CMP AL,1BH
JE EXIT1 ;若是ESC,则跳转到EXIT,返回DOS
JMP DELAY
;=================================================================
EXIT1:
MOV AH,4CH
INT 21H
;=================================================================
DISPLAY1 PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,5 ;逐个显示BUF数据段中的数据
LEA SI,BUF
XS: MOV DL,BUF[SI] ;XS为显示循环标号
MOV AH,02H
INT 21H
INC SI
LOOP XS
MOV DL,0DH ;覆盖显示数据
MOV AH,02H
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
DISPLAY1 ENDP
;==================================================================
MAIN ENDP
CODE ENDS
END START