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

📄 clock.asm

📁 使用汇编语言
💻 ASM
字号:
DATA	SEGMENT
   INT08_SEG DW ?
   INT08_OFF DW ?
    COUNT DB 18  
  THEAD DB 9
        DB ?	
  TIME DB '00:00:00'  
  TEND    DB '$'
  MESSAGE DB 'PLEASE INPUT THE BEGIN TIME:',0AH,'$'
DATA	ENDS
STACK SEGMENT STACK
      DB 50 DUP(?)
STACK ENDS
CODE SEGMENT
        ASSUME DS:DATA,CS:CODE,SS:STACK
   START:
       MOV AX,DATA
       MOV DS,AX
       CLI
       LEA DX,MESSAGE     
       MOV AH,9
       INT 21H	 ;初始信息输出
       LEA DX,THEAD
       MOV AH,0AH
       INT 21H	 ;时间输入
       ;调用函数
       CALL    SAVE
       CALL    CHANGE
       CALL    INIT
       STI
BEGIN:         
             	MOV AH,0
		INT 16H
		CMP AL,1BH	;判断是否为ESC键
		JNZ BEGIN
    PEND:
       CALL  RESUME
                        	;返回操作系统
            MOV AH,4CH
            INT 21H           ;主程序结束
;========================新的中断服务程序====================================
NEW_INT  PROC
          	PUSH DS
		PUSH ES
		MOV AX,DATA
		MOV DS,AX
           	MOV AL,COUNT
           	DEC AL
           	MOV COUNT,AL
           	CMP AL,0
           	JNE S1  
            MOV AL,18          ;更新COUNT值
            MOV COUNT,AL
            LEA DI,TEND   
            DEC DI
            MOV AL,[DI]
            INC AL       
            MOV [DI],AL
            CMP AL,3AH
            JNE DISPTIME
            MOV AL,30H   ;else的情况,清空
            MOV [DI],AL
            DEC DI
            MOV AL,[DI]
            INC AL      
            MOV [DI],AL
            CMP AL,36H   ;比较是否为6
            JNE DISPTIME
            MOV AL,30H   
            MOV [DI],AL
	;分钟值
            DEC DI
            DEC DI
            MOV AL,[DI]
            INC AL       
            MOV [DI],AL
            CMP AL,3AH
            JNE DISPTIME
            MOV AL,30H   ;else
            MOV [DI],AL
            DEC DI
            MOV AL,[DI]
            INC AL      
            MOV [DI],AL
            CMP AL,36H   
            JNE DISPTIME
            MOV AL,30H   
            MOV [DI],AL
	;时钟值
            DEC DI
            DEC DI
            MOV AL,[DI]
            INC AL       
            MOV [DI],AL
            CMP AL,3AH
            JNE T1
            MOV AL,30H  
            MOV [DI],AL
            DEC DI      
            MOV AL,[DI]
            INC AL
            MOV [DI],AL
            JMP DISPTIME
      T1: CMP AL,34H    ;判断是否为24
            JNE DISPTIME
            DEC DI
            MOV AL,[DI]
            CMP AL,32H
            JNE DISPTIME
            MOV AL,30H   
            MOV [DI],AL
            INC DI
            MOV [DI],AL
     	DISPTIME:   CALL DISP
S1:
      MOV AL,20H
	OUT 20H,AL
  	POP ES
	POP DS
      IRET
NEW_INT ENDP
;============================系统定时器初始化==================================
INIT	PROC
		MOV AL,36H
		OUT 43H,AL
		MOV AX,0	      ;置计数初值
		OUT 40H,AL
		MOV AL,AH
		OUT 40H,AL
		RET
INIT	ENDP
;=============================读取系统08号中断向量=============================
SAVE PROC
		MOV AX,3508H
		INT 21H
		MOV INT08_OFF,BX
		MOV INT08_SEG,ES
		RET
SAVE ENDP
;==============================写入用户08型中断向量============================
CHANGE	PROC
		PUSH DS
		MOV AX,SEG NEW_INT
		MOV DS,AX
		MOV DX,OFFSET NEW_INT
		MOV AX,2508H
		INT 21H
		POP DS
		RET
CHANGE	ENDP
;==============================恢复中断和8253的设置============================
RESUME	PROC
		MOV AL,0
		OUT 40H,AL
		OUT 40H,AL
		MOV DX,INT08_OFF
		MOV DS,INT08_SEG
		MOV AX,2508H
		INT 21H
		RET
RESUME	ENDP
;=============================显示过程==========================================
DISP PROC
            PUSH DS
	    PUSH ES
            MOV  AX, DATA
            MOV DS,AX
            MOV ES,AX
            LEA BP,TIME
            MOV   DH, 12		; 置光标位置
            MOV   DL, 32
            MOV	  AH, 9			
            MOV	  AL, 1
            MOV	  BH, 0			
            MOV	  BL, 1EH		
            MOV	  CX, 8        
            MOV   AH, 13H
            INT	  10H           
            POP ES
	    POP DS
             RET
DISP  ENDP

CODE	ENDS
      END START

⌨️ 快捷键说明

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