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

📄 daytime.asm

📁 用汇编语言(8086/DOS)实现一个显示系统时间的程序
💻 ASM
字号:
STACK SEGMENT STACK            ;堆栈段
      DW 200 DUP (?)
      TP  DB  256 DUP(0)
      TPP  EQU LENGTH TP
STACK ENDS

DATA SEGMENT                   ;数据段 
      SPACE DB 1000 DUP (' ')
      PATTERN DB 6 DUP (' '),0C9H,26 DUP (0CDH),0BBH,6 DUP (' ')
              DB 6 DUP (' '),0BAH,26 DUP (20H),0BAH,6 DUP (' ')
              DB 6 DUP (' '),0C8H,26 DUP (0CDH),0BCH,6 DUP (' ')
      DBUFFER DB 8 DUP (':'),12 DUP (' ')    ;显示时间
      DBUFFER1 DB 20 DUP (' ')               ;显示日期
      STR  DB 0DH,0AH, 'PLEASE INPUT DATE(D) OR TIME(T) OR QUIT(Q) OR (C) $'
      STR1  DB 0AH,0AH,'DESIGN BY GUAN GANG YU $'
      COUNT  DB 0
      T1  DB   '          counter time:'     ;显示跑表
      TENH  DB        30H
      HOUR  DB        30H
            DB        ':'
      TENM  DB        30H 
      MINUTE  DB      30H
              DB      ':'
      TENS  DB        30H
      SECOND  DB      30H,13,'$'  ;不换行
 DATA ENDS
CODE SEGMENT                   ;代码段
      ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START: MOV   AX,0001H          ;设置显示方式为40*25彩色文本方式,并清屏            
       INT   10H
       MOV   AX,DATA
       MOV   DS,AX
       MOV   ES,AX
       MOV   BP,OFFSET SPACE       
       MOV   DX,0B00H          ;设置显示的位置为0B行,00列
       MOV   CX,1000           ;设置显示颜色的长度
       MOV   BX,0040H          ;
       MOV   AX,1300H 
       INT   10H
       MOV   BP,OFFSET PATTERN ;显示矩形条     
       MOV   DX,0B00H
       MOV   CX,120
       MOV   BX,004EH
       MOV   AX,1301H
       INT   10H
       LEA   DX,STR            ;显示提示信息
       MOV   AH,9
       INT   21H
       LEA   DX,STR1            ;显示提示信息
       MOV   AH,9
       INT   21H
       MOV   AH,1               ;从键盘输入单个字符
       INT   21H
       CMP   AL,44H             ;AL='D'?
       JNE   A
       CALL  DATE               ;显示系统日期
A:     CMP   AL,54H             ;AL='T'?
       JNE   B                  
       CALL  TIME               ;显示系统时间   
B:     CMP   AL,43H             ;AL='C'?
       JNE   D
       CALL  COUNTER            ;显示跑表        
D:     CMP   AL,51H             ;AL='Q'?            
       JNE   START
       MOV   AH,4CH             ;返回dos状态
       INT   21H  

DATE   PROC  NEAR               ;显示日期子程序
DISPLAY:MOV  AH,2AH             ;取日期
       INT   21H
       MOV   SI,0
       MOV   AX,CX
       MOV   BX,100
       DIV   BL
       MOV   BL,AH
       CALL  BCDASC1            ;日期数值转换成相应的ASCII码字符
       MOV   AL,BL
       CALL  BCDASC1
       INC   SI
       MOV   AL,DH
       CALL  BCDASC1
       INC   SI
       MOV   AL,DL
       CALL  BCDASC1
       MOV   BP,OFFSET DBUFFER1
       MOV   DX,0C0DH
       MOV   CX,20
       MOV   BX,004EH
       MOV   AX,1301H
       INT   10H
       MOV   AH,02H             ;设置光标位置
       MOV   DX,0300H
       MOV   BH,0
       INT   10H
       MOV   BX,0018H
REPEA: MOV   CX,0FFFFH          ;延时
MAO: LOOP    MAO
       DEC   BX
       JNZ   REPEA
       MOV   AH,01H             ;读键盘缓冲区字符到AL寄存器
       INT   16H
       JE    DISPLAY
       JMP   START
       MOV   AX,4C00H
       INT   21H
       RET
DATE  ENDP

TIME   PROC NEAR                ;显示时间子程序
DISPLAY1:MOV SI,0
       MOV   BX,100
       DIV   BL
       MOV   AH,2CH             ;取时间
       INT   21H
       MOV   AL,CH
       CALL  BCDASC             ;将时间数值转换成ASCII码字符
       INC   SI
       MOV   AL,CL
       CALL  BCDASC
       INC   SI
       MOV   AL,DH
       CALL  BCDASC
       MOV   BP,OFFSET DBUFFER
       MOV   DX,0C0DH
       MOV   CX,20
       MOV   BX,004EH
       MOV   AX,1301H
       INT   10H
       MOV   AH,02H
       MOV   DX,0300H
       MOV   BH,0
       INT   10H
       MOV   BX,0018H
RE:    MOV   CX,0FFFFH
REA:   LOOP  REA
       DEC   BX
       JNZ   RE
       MOV   AH,01H
       INT   16H
       JE    DISPLAY1
       JMP   START
       MOV   AX,4C00H
       INT   21H
       RET
TIME  ENDP

COUNTER       PROC
       MOV    DX,0C0DH             ;定时间显示颜色位置
       MOV    CX,8                 ;显示颜色长度
       MOV    BX,004EH             ;设置背景颜色(00)和前景颜色(4E)
       MOV    AX,1300H
       INT    10H
       MOV    AH,02H
       MOV    DX,0C00H             ;定显示位置
       MOV    BH,0                 ;页号为0
       INT    10H
       PUSH   DS
       MOV    AX,0
       PUSH   AX
       CLI                         ;关中断
       MOV    AX,DATA
       MOV    DS,AX
       MOV    AX,STACK
       MOV    SS,AX
       MOV    SP,TPP
       MOV    AX,351CH             ;取中断al=1ch中断向量号
       INT    21H
       PUSH   BX                   ;保存中断向量
       PUSH       ES
       MOV        DX,SEG TIMER
       MOV        DS,DX
       LEA        DX,TIMER
       MOV        AX,251CH         ;设置中断
       INT        21H
       MOV        AX,DATA
       MOV        DS,AX                                            
CHECK:  MOV       AH,1             ;读键盘缓冲区字符
        INT       16H
        JZ        TICKON3          ;显示字符
        JMP       E
TICKON3:  JMP     TICKON2
E:      CLI                        ;关中断
        MOV       AH,00H           ;从键盘读字符
        INT       16H   
        CMP       AL,'C'
        JE        TICKON
        CMP       AL,'P'
        JE        TICKON1
        CMP       AL,'R'
        JE        RESET
        CMP       AL,'Q'
        JE        TICKOFF           ;返回dos状态
        JMP       TICKON
T:      JMP       START

;子程序

TICKON1:  MOV       AX,DATA         ;暂停
          MOV       DS,AX
          MOV       AX,351CH
          INT       21H
          MOV       DX,SEG TIMER1
          MOV       DS,DX
          LEA       DX,TIMER1
          MOV       AX,251CH
          INT       21H
          MOV       AX,DATA
          MOV       DS,AX
          JMP       E
RESET:    MOV       COUNT,0
          MOV       SECOND,30H
          MOV       TENS,30H
          MOV       MINUTE, 30H
          MOV       TENM,30H
          MOV       HOUR, 30H
          MOV       TENH,30H
          MOV       DX,OFFSET T1
          MOV       AH,9               ;显示字符
          INT       21H
          MOV       AH,0               ;从键盘读字符
          INT       16H
          CMP       AL,'Q'
          JE        TICKOFF
          CMP       AL,'C'
          JNE       RESET             
TICKON:   MOV       AX,351CH           ;开始计时
          INT       21H
          MOV       DX,SEG TIMER
          MOV       DS,DX
          LEA       DX,TIMER
          MOV       AX,251CH
          INT       21H
          MOV       AX,DATA
          MOV       DS,AX
TICKON2:  MOV       DX,OFFSET T1
          MOV       AH,9              ;显示字符
          INT       21H
          JMP       CHECK
TICKOFF:  CLI                         ;关中断   返回DOS状态
          POP       DS
          POP       DX
          MOV       AX,251CH
          INT       21H
          STI                         ;开中断                         
          MOV       AH,4CH            ;返回DOS状态
          INT       21H
          RET
COUNTER  ENDP
TIMER1   PROC                        ;恢复中断
         IRET
TIMER1  ENDP
TIMER   PROC      FAR
        PUSH      AX
        MOV       AX,DATA
        MOV       DS,AX
        ASSUME    DS:DATA
        INC       COUNT
        CMP       COUNT,18           ;日时钟的计时单位是54.9毫秒,54.9*18=1秒
        JL        EXIT               ;计数不满18跳回
        MOV       COUNT,0            ;计数满18清0重置
        INC       SECOND             ;秒加1
        CMP       SECOND,39H
        JLE       EXIT
        MOV       SECOND,30H         ;等于9清0重计
        INC       TENS               ;十位加一
        CMP       TENS,36H           ;十位为6
        JL        EXIT
        MOV       TENS,30H
        INC       MINUTE
        CMP       MINUTE,39H
        JLE       EXIT
        MOV       MINUTE, 30H
        INC       TENM
        CMP       TENM,36H
        JL        EXIT
        MOV       TENM,30H
        INC       HOUR
        CMP       HOUR,39H
        JLE       EXIT
        MOV       HOUR, 30H
        INC       TENH
        CMP       TENH,32H
        JE        TIME1
        JL        EXIT
TIME1:  CMP       HOUR , 34H
        JL        EXIT
        MOV       TENH,30H
EXIT:   POP       AX
        IRET
        TIMER     ENDP

BCDASC PROC NEAR                ;时间数值转换成ASCII码字符子程序
       PUSH BX
       CBW
       MOV BL,10
       DIV BL
       ADD AL,'0'
       MOV DBUFFER[SI],AL
       INC SI
       ADD AH,'0'
       MOV DBUFFER[SI],AH
       INC SI
       POP BX
       RET
BCDASC ENDP

BCDASC1 PROC NEAR              ;日期数值转换成ASCII码字符子程序
       PUSH BX
       CBW
       MOV BL,10
       DIV BL
       ADD AL,'0'
       MOV DBUFFER1[SI],AL
       INC SI
       ADD AH,'0'
       MOV DBUFFER1[SI],AH
       INC SI
       POP BX
       RET
BCDASC1 ENDP
CODE   ENDS
       END START


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -