⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8086.asm

📁 DOS环境中的微机原理课程设计
💻 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 + -