📄 8086.asm
字号:
DATA SEGMENT
BUFFER DB 13 DUP(?)
BEGIN DB "INPUT S TO BEGIN!R TO RESET!E TO PAUSE!Q TO QUIT!$"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN: MOV AX,DATA
MOV DS,AX
GO: MOV DL,0DH
MOV AH,02H
INT 21H
LEA DX,BEGIN ;输出提示字符传INPUT S TO BEGIN!R TO RESET!E TO PAUSE!Q TO QUIT
MOV AH,09H ;DX为BEGIN首地址
INT 21H ;开21H中断
MOV AH,08H ;等待输入命令,如果是S就开始
INT 21H
CMP AL,'S'
JNZ GOON5
JMP RESET0
GOON5: CMP AL,'Q'
JNZ GO
JMP QUIT
RESET0: MOV CX,0 ;清零
MOV DX,0
START1: CALL DELAY ;延时0.01S
MOV AL,CL ;CH--时 DH---分 DL-----秒 CL----百分之一秒
ADD AL,1
DAA
MOV CL,AL
CMP AL,99H ;CL到100就清零,DL++
JB DISPLAY
MOV CL,0
MOV AL,DL
ADD AL,1
DAA
MOV DL,AL
CMP AL,60H ;DL到60,DH++
JB DISPLAY
MOV DL,0
MOV AL,DH
ADD AL,1
DAA
MOV DH,AL
CMP AL,60H ;DH到60,CH++
JB DISPLAY
MOV DH,0
MOV AL,CH
ADD AL,1
DAA
MOV CH,AL
CMP AL,24H ;CH到24,CH=0
JB DISPLAY
MOV CH,0
DISPLAY: LEA BX, BUFFER
MOV AL,CH
CALL YBCD_ASC
INC BX
MOV AL,':'
MOV [BX],AL
INC BX
MOV AL,DH
CALL YBCD_ASC
INC BX
MOV AL,':'
MOV [BX],AL
INC BX
MOV AL,DL
CALL YBCD_ASC
INC BX
MOV AL,':'
MOV [BX],AL
INC BX
MOV AL,CL
CALL YBCD_ASC
INC BX
MOV AL,'$'
MOV [BX],AL
PUSH BX
PUSH CX
PUSH DX
CALL LOCATION
LEA DX, BUFFER
MOV AH,09H
INT 21H
POP DX
POP CX
POP BX
MOV AH,0BH ;判断有无键盘输入
INT 21H
INC AL
JNZ NOKEY ;无键输入就继续运行
MOV AH,08H
INT 21H
CMP AL,'E' ;是E吗?
JNZ GOON
JMP END1
GOON: CMP AL,'R' ;是R吗?
JNZ GOON1
JMP RESET
GOON1: CMP AL,'Q' ;要退出吗?
JNZ NOKEY
JMP QUIT
NOKEY: JMP START1
YBCD_ASC PROC ;压缩BCD码转换成非压缩并存入BUFFER中
PUSH CX
MOV CL,AL ;右移取高四位
SHR AL,1
SHR AL,1
SHR AL,1
SHR AL,1
ADD AL,30H ;0~9的ASCII码位其加上30H
MOV [BX],AL
INC BX
MOV AL,CL
AND AL,0FH
ADD AL,30H
MOV [BX],AL
POP CX
RET
YBCD_ASC ENDP
LOCATION PROC
MOV DH,0CH ;将光标定于屏幕中间并显示
MOV DL,21H
MOV BH,0
MOV AH,02H
INT 10H
RET
LOCATION ENDP
DELAY PROC ;延时函数有两层循环
PUSH CX
PUSH AX
MOV AX,10AH
MOV CX,0FFFFH
NEXT: DEC AX
JNZ NEXT1
JMP OUT1
NEXT1: DEC CX
JNZ NEXT1
JMP NEXT
OUT1: POP AX
POP CX
RET
DELAY ENDP
END1: PUSH DX
CALL LOCATION
MOV AH,09H ;若有E按下则跳至此,停止跑表
LEA DX,BUFFER
INT 21H
POP DX
MOV AH,08H
INT 21H
CMP AL,'E'
JNZ GOON4
JMP START1
GOON4: CMP AL,'Q'
JNZ GOON6
JMP QUIT
GOON6: CMP AL,'R'
JNZ END1
JMP RESET
RESET: LEA BX, BUFFER ;若有R按下则跳至此,清零,把BUFFER里相应位赋‘0’
MOV AL,'0'
MOV [BX],AL
INC BX
MOV [BX],AL
INC BX
MOV AL,':'
MOV [BX],AL
INC BX
MOV AL,'0'
MOV [BX],AL
INC BX
MOV [BX],AL
INC BX
MOV AL,':'
MOV [BX],AL
INC BX
MOV AL,'0'
MOV [BX],AL
INC BX
MOV [BX],AL
INC BX
MOV AL,':'
MOV [BX],AL
INC BX
MOV AL,'0'
MOV [BX],AL
INC BX
MOV [BX],AL
INC BX
MOV AL,'$'
MOV [BX],AL
R1: CALL LOCATION
LEA DX,BUFFER
MOV AH,09H
INT 21H
MOV AH,08H
INT 21H
CMP AL,'S'
JNZ GOON3
JMP RESET0 ;清零后跳回开始等待新的命令
GOON3: CMP AL,'Q'
JNZ R1
JMP QUIT
QUIT: MOV AH,4CH ;退出程序,返回操作系统
INT 21H
CODE ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -