. . . .
NEXT3: MOV AH,08H ;若为结束信号则计时暂停
INT 21H
CMP AL,'C' ;判断计时是否继续 JE AGAIN
CMP AL,'R' ; 判断是否为复位信号 JNE NEXT3 CALL GO CALL IOSET
MOV DX,OFFSET BUFFER MOV AH,09H INT 21H
JMP LOAD RET START
ENDP
GO PROC MOV BX,OFFSET BUFFER MOV AL,'0' MOV [BX],AL INC BX MOV AL,'0' MOV [BX],AL INC BX
.. .. .. 若为复位信号则复位并转至开头等待
;若为非复位信号则继续等待键入; ;赋值程序 . . . .
MOV AL,':' MOV [BX],AL INC BX MOV AL,'0' MOV [BX],AL INC BX MOV AL,'0' MOV [BX],AL INC BX MOV AL,':' MOV [BX],AL INC BX MOV AL,'0' MOV [BX],AL INC BX MOV AL,'0' MOV [BX],AL INC BX MOV AL,'$' MOV [BX],AL
RET GO .. .. ..
ENDP
. . . .
IOSET PROC ;光标置屏中央程序
MOV DX,0D27H MOV BH,00 MOV AH,02H INT 10H RET IOSET ENDP HALT
PROC MOV AH,08H INT 21H CMP AL,'S' JNE HALT RET HALT ENDP
TRAN
PROC MOV CL,AL SHR AL,1 SHR AL,1 SHR AL,1 SHR AL,1 OR AL,30H MOV [BX],AL
.. .. .. ;等待开始信号键入程序BCD码转ASCII码程序
; . . . .
INC BX MOV AL,CL AND AL,0FH OR AL,30H MOV [BX],AL RET TRAN
ENDP
TIME PROC PUSH CX PUSH AX MOV AX,00B0H
MOV CX,0FFFFH A1: DEC AX
JNZ A2 JMP A3 A2: DEC CX
JNZ A2 JMP A1 A3: POP AX POP CX
RET TIME ENDP
.. .. ..
;延时程序 . . . .
COD ENDS
END START ;程序结束 五、程序调试
由于是第一次用汇编语言编写一个较为复杂的程序以实现具体功能,在编写以及调试过程中我们遇到了很多问题,经过组员的努力和同学及老师的帮助问题得以顺利解决,下面列举了我们遇到的问题及其解决方法以供参考。
1.我们将程序打入电脑进行汇编时,发现汇编程序运行后没有生成相应格式的文件,相反却是满页的错误提示,按照软件的提示我们查找问题,发现都是低级错误,只要认真即可避免。
2.经过正确的汇编后,可执行文件生成,开始后进入DOS运行界面,屏幕上显示的全是乱码,经过查找,最终我们找到问题症结所在:缓冲区赋初值后没有在其末尾赋入结束标志字符‘$’,经过重新定义,问题解决。
3.乱码问题解决后,屏幕显示计数结果,但却并没有显示在屏幕中央,这种问题只能是光标定位程序IOSET调用出现错误,在仔细检查该程序后发现DX赋值错误,将0027H改为0D27H后问题解决。
4.重新运行程序时,我们发现1/100秒值未从零开始变化而是从13开始 递变,经过我们三个的努力和同学的帮助我们找到了错误原因:AGING程序开始运行时,DH和DL(分别存放秒值和1/100秒值)在此前的过程之前DH和DL的值发生变化,因此须在AGAIN程序的开始将DH和DL置零,问题解决。
5.屏幕中央显示结果时,只有秒和百分之一秒显示,没有分显示。经检查是显示程序中没有定义分显示,加上分显示程序后分秒正常跳动。
6.我们添加宏定义不能运行,没有得到预期的效果。经过我们组员的努力,
.. .. ..