汇编实验:时钟实验

实验六 时钟实验

一、实验目的

综合运用前面6个实验掌握的知识,实现数据通过中断调用从键盘输入,经过转换、处理后,通过中断调用输出处理结果。

二、实验内容

设计24小时进位的电子表。
利用加法、码制转换或DOS功能调用设计电子表。
显示格式为:时:分:秒
把时间稳定地显示在CRT上,起始时间可调,时间采用24小时进制或读取系统时钟。
根据要求画出程序框图、编写出程序并调试通过。

三、实验内容

在这里插入图片描述

四、实验源代码

DATA SEGMENT
    sentence1 DB 'Input now time,like xx:xx:xx',0AH,0DH,'$'
    sentence2 DB 'A new day begins!',0AH,0DH,'$'
    sentence3 DB 'Input error!',0AH,0DH,'$'
    Time DB 9,?,9 DUP(?);存储时间值
    NewLine DB 0AH,0DH,'$'
    Retvalue DB 0
DATA ENDS

STACK SEGMENT
    DW 100 DUP(?)
STACK ENDS

CODE SEGMENT
        ASSUME CS:CODE,DS:DATA,SS:STACK
START:  MOV AX,DATA
        MOV DS,AX

AGAIN:  CALL INPUT;输入倒计时
        CMP Retvalue,1
        JZ  TIMING;输入格式正确

        LEA DX,sentence3;输入格式错误
        MOV AH,09H
        INT 21H
        JMP AGAIN

TIMING: CALL DELAY;延时
        CALL UPDATE;更新计时值
        CMP Retvalue,1;判断计时是否结束
        JZ  TIMING
        JMP AGAIN

        MOV AH,4CH
        INT 21H

;输入倒计时时间,格式为xx:xx上限是59:59
;返回值在RetValue中,输入格式正确值为1,否则为0
INPUT PROC
        PUSH AX
        PUSH DX

        LEA DX,sentence1;输出指示字符串
        MOV AH,09H
        INT 21H

        LEA DX,Time;输入倒计时值
        MOV AH,0AH
        INT 21H

        MOV AL,Time+2;检测输入是否符合格式
        CMP AL,'0'
        JB ERROR
        CMP AL,'2'
        JA ERROR
        JZ B1
        MOV AL,Time+3
        CMP AL,'0'
        JB ERROR
        CMP AL,'9'
        JA ERROR
        JMP B2
B1:     MOV AL,Time+3
        CMP AL,'0'
        JB ERROR
        CMP AL,'3'
        JA ERROR
B2:     MOV AL,Time+4
        CMP AL,':'
        JNZ ERROR
        MOV AL,Time+5
        CMP AL,'0'
        JB ERROR
        CMP AL,'5'
        JA ERROR
        MOV AL,Time+6
        CMP AL,'0'
        JB ERROR
        CMP AL,'9'
        JA ERROR
        MOV AL,Time+7
        CMP AL,':'
        JNZ ERROR
         MOV AL,Time+8
        CMP AL,'0'
        JB ERROR
        CMP AL,'5'
        JA ERROR
        MOV AL,Time+9
        CMP AL,'0'
        JB ERROR
        CMP AL,'9'
        JA ERROR
        CALL OUTPUT
        MOV Retvalue,1;输入正确返回值为1
        JMP EXITI

ERROR:  MOV Retvalue,0;输入错误返回值为0
EXITI:  POP DX
        POP AX
        RET
INPUT ENDP

;输出函数,输出当前的计时到屏幕
OUTPUT PROC
        PUSH AX
        PUSH DX

        LEA DX,Time+2
        MOV AH,09H
        INT 21H

        POP DX
        POP AX
        RET
OUTPUT ENDP

;更新计时时间
;返回值在RetValue中,倒计时结束值为0,否则为1
UPDATE PROC
        PUSH AX
        PUSH BX

        LEA BX,Time+9;判断是否计时结束
        MOV AL,[BX]
        CMP AL,'9'
        JNZ U1
        DEC BX
        MOV AL,[BX]
        CMP AL,'5'
        JNZ U2
        DEC BX
        DEC BX
        MOV AL,[BX]
        CMP AL,'9'
        JNZ U3
        DEC BX
        MOV AL,[BX]
        CMP AL,'5'
        JNZ U4
        DEC BX
        DEC BX
        DEC BX
        MOV AL,[BX]
        CMP AL,'2'
        JZ  A1
        INC BX
        MOV AL,[BX]
        CMP AL,'9'
        JNZ U5
        JMP A2
A1:     INC BX
        MOV AL,[BX]
        CMP AL,'3'
        JNZ U5
A2:     DEC BX
        MOV AL,[BX]
        CMP AL,'2'
        JNZ U6
        MOV [BX],'0'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],':'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],':'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],'0'
        CALL OUTPUT
        LEA DX,sentence2;计时结束输出字符提示
        MOV AH,09H
        INT 21H
        MOV Retvalue,0;返回值为0
        JMP EXITU

        ;修改计时值
        ;格式为xx:xx(x为非0值)
U1:     INC AL
        MOV [BX],AL
        CALL OUTPUT
        JMP RETURN
        ;格式为xx:x0(x为非0值)
U2:     INC AL
        MOV [BX],AL
        INC BX
        MOV [BX],'0'
        CALL OUTPUT
        JMP RETURN
        ;格式为xx:00(x为非0值)
U3:     INC AL
        MOV [BX],AL
        INC BX
        MOV [BX],':'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],'0'
        CALL OUTPUT
        JMP RETURN
        ;格式为x0:00(x为非0值)
U4:     INC AL
        MOV [BX],AL
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],':'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],'0'
        CALL OUTPUT
        JMP RETURN
U5:     INC AL
        MOV [BX],AL
        INC BX
        MOV [BX],':'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],':'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],'0'
        CALL OUTPUT
        JMP RETURN
U6:     INC AL
        MOV [BX],AL
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],':'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],':'
        INC BX
        MOV [BX],'0'
        INC BX
        MOV [BX],'0'
        CALL OUTPUT
        JMP RETURN

RETURN: MOV Retvalue,1;返回值为1
EXITU:  POP BX
        POP AX
        RET
UPDATE ENDP

;延时1s左右
DELAY PROC NEAR
        PUSH BX
        PUSH CX
        MOV BX,300H
DLOOP1: MOV CX,0FFFH
DLOOP2: LOOP DLOOP2
        DEC BX
        JNZ DLOOP1
        POP CX
        POP BX
        RET
DELAY ENDP

        CODE ENDS
        END START

       RET
UPDATE ENDP

;延时1s左右
DELAY PROC NEAR
        PUSH BX
        PUSH CX
        MOV BX,300H
DLOOP1: MOV CX,0FFFH
DLOOP2: LOOP DLOOP2
        DEC BX
        JNZ DLOOP1
        POP CX
        POP BX
        RET
DELAY ENDP

        CODE ENDS
        END START
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值