汇编闹钟程序



一、实验目的

《汇编语言程序设计》是计算机专业重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握8088宏汇编语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。

二、实验要求

小闹钟:

1.从键盘输入闹铃时间(如2分钟)

2.程序开始记时,并在屏幕上显示时间(如000001)并实时刷新

3.时间到,则发出闹铃声,声音维持数秒;同时时间停止刷新

4.能处理输入错误(如闹铃时间应该为数字,用户输入非数值型的字符则显示错误提示。)

 

三、实验原理分析

  1. 设置响铃时间(本程序只精确到分钟)分别设置了小时与分钟两个值。程序运行时,会有提醒输入格式(XXXX),必须以此格式输出,否则系统判断为错误,并发出警告,提示输入错误。小时的范围首个数字不能大过3,分钟的范围在0-59之间。否则发出警告,提示输入错误。而且中间必须以分号隔开,否则也会出现错误;

  2. 输入的时间,将分别存储在hourmin两个单元里,并用十进制数字显示出来,以便测试之前的存储是否成功,和方便我们人为的比较;

  3. MOV AH,2CH来获取当前系统的时间,将小时存储在CH中,分钟存储在CL中;

  4. 调用子程序将获得的当前时间显示出来,并在没有到达响铃时间之前实现不断刷新,且显示出来;

  5. 当前时间与设置好的时间进行比较,若是小时数与分钟数相同,即到达响铃时间,刷新停止,显示“Time is over!”,并发出声音。

     

    四、流程图

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


不同

 

 

 

 

 

 

 

五、源程序(加必要注释,要有程序运行的截图。)

设置闹钟时间:

输入格式错误,提示“You set the error time!,退出程序

显示闹钟时间,并获取当前系统时间,时间未到,实现不断刷新系统当前时间

时间到,提示“Time is over!”,停止刷新,并发出声音

DATAS SEGMENT

    HOUR DW ?

    MIN DW ?

    X DB 'Please input the ring time(XX:XX):$'

    Y DB 'The ring time is:$'

    Z DB 'The present time is:$'

    W DB 'Time is over!$'

    ERROR DB 'you set the error time!$'

    ;此处输入数据段代码 

DATAS ENDS

 

CODES SEGMENT

    ASSUMECS:CODES,DS:DATAS,SS:STACKS

MAIN PROC

       PUSH DS

       XOR AX,AX

       PUSH AX

       MOV AX,DATAS

       MOV DS,AX

       CALL Crlf

       CALL Crlf

       LEA DX,X

       MOV AH,09H

       INT 21H

       CALL SetTime

       CALL CleanLine

      

       LEA DX,Y

       MOV AH,09H

       INT 21H

       CALL ShowRingTime;显示响铃时间(测试输入的时间是否正确存储)

       CALL Crlf

       CALL Crlf

TIME:

       LEA DX,Z

       MOV AH,09H

       INT 21H

       CALL GetTime;获取系统当前时间

       CMP SI,2

       MOV DL,0DH

       MOV AH,02H

       INT 21H

       JE Ring

       JMP TIME

Ring:                   ;响铃

       CALL Crlf

       CALL Crlf

       LEA DX,W

       MOV AH,09H

       INT 21H

      

       MOV     DX,10

       SING:  

       PUSH DX       

       MOV BX,200       

       CALL MIDO       

       MOV BX,1000       

       CALL MIDO       

       POP DX       

       DEC DX       

       JNZ SING

      

       MOV AH,4CH

       INT 21H

MAIN ENDP

 

SetTime PROC;设置响铃时间

    PUSH AX

    PUSH BX

    PUSH CX

    PUSH DX

   

    MOV BX,0;存储小时数

    MOV AH,01H

    INT 21H

    CMP AL,30H

    JB WRONG

    CMP AL,32H

    JA WRONG

    SUB AL,30H

    MOV AH,0

    XCHG AX,BX

    MOV DI,10

    MUL DI

    ADD BX,AX

    MOV AH,01H

    INT 21H

    CMP AL,30H

    JB WRONG

    CMP AL,39H

    JA WRONG

    SUB AL,30H

    MOV AH,0

    XCHG AX,BX

    MOV DI,10

    MUL DI

    ADD BX,AX

    MOV HOUR,BX

    MOV AH,01H

    INT 21H

    CMP AL,':'

    JNZ WRONG

   

    MOV BX,0;存储分钟数

    MOV AH,01H

    INT 21H

    CMP AL,30H

    JB WRONG

    CMP AL,36H

    JA WRONG

    SUB AL,30H

    MOV AH,0

    XCHG AX,BX

    MOV DI,10

    MUL DI

    ADD BX,AX

    MOV AH,01H

    INT 21H

    CMP AL,30H

    JB WRONG

    CMP AL,39H

    JA WRONG

    SUB AL,30H

    MOV AH,0

    XCHG AX,BX

    MOV DI,10

    MUL DI

    ADD BX,AX

    MOV MIN,BX

    JMP D1

WRONG:

    CALL Crlf

    LEADX,ERROR

    MOV AH,09H

    INT 21H

    MOV AH,4CH

    INT 21H

D1:

    POP DX

    POP CX

    POP BX

    POP AX

    RET

    SetTime ENDP

   

CleanLine PROC;清屏(清除光标所在行)

       PUSH AX

       PUSH BX

       PUSH CX

       PUSH DX

      

       MOV CX,40

       MOV DL,0DH

       MOV AH,02H

       INT 21H

       C1:

       MOV DL,' '

       MOV AH,02H

       INT 21H

       LOOP C1

       MOV DL,0DH

       MOV AH,02H

       INT 21H

      

       POP DX

       POP CX

       POP BX

       POP AX

       RET

CleanLine ENDP

 

Crlf PROC;回车换行

       PUSH AX

       PUSH BX

       PUSH CX

       PUSH DX

      

       MOV DL,0AH

       MOV AH,02H

       INT 21H

       MOV DL,0DH

       MOV AH,02H

       INT 21H

      

       POP DX

       POP CX

       POP BX

       POP AX

       RET

Crlf ENDP

 

ShowRingTime PROC;显示响铃时间(测试输入的时间是否正确存储)

       PUSH AX

       PUSH BX

       PUSH CX

       PUSH DX

      

    LEA SI,HOUR

    MOV AX,[SI]

    CALLOutNumber

    MOV DL,':'

    MOV AH,02H

    INT 21H

    LEA SI,MIN

    MOV AX,[SI]

    CALL OutNumber

   

    POP DX

    POP CX

    POP BX

    POP AX

    RET

ShowRingTime ENDP

   

OutNumber PROC;十进制数字输出

    PUSH AX

    PUSH BX

    PUSH CX

    PUSH DX

   

    MOV CX,0

    MOV BX,10

    CMP AX,0

    JGE B1

    PUSH AX

    MOV DL,'-'

    INT 21H

    POP AX

    NEG AX

B1:

    MOV DX,0

    DIV BX

    PUSH DX

    INC CX

    CMP AX,0

    JNZ B1

   

    MOV AH,02H

    CMP CX,2

    JAE B2

    MOV DX,0

    PUSH DX

    INC CX

B2:

       POP DX

       ADD DX,30H

      

       INT 21H

       LOOP B2

   

    POP DX

    POP CX

    POP BX

    POP AX

    RET

OutNumber ENDP

 

GetTime PROC;获取系统当前时间

    PUSH AX

    MOV SI,0

    MOV AH,2CH;获取系统时间

    INT 21H

    MOV AL,CH

    MOV AH,0

    CMP AX,HOUR

    JE D1

D2:

       CALL OutNumber

       MOV DL,':'

       MOV AH,02H

       INT 21H

       MOV AH,0

       MOV AL,CL

       CBW

       CMP AX,MIN

       JE D3

D4:

       CALL OutNumber

       MOV DL,':'

       MOV AH,02H

       INT 21H

       MOV AH,0

       MOV AL,DH

       CBW

       CALL OutNumber

       JMP D5

D1:

       INC SI

       JMP D2

D3:

       INC SI

       JMP D4

D5:POPAX

    RET

GetTime ENDP

 

MIDO PROC  ;响铃声音     

       MOV AL,0B6H       

       OUT 43H,AL       

       MOV AX,34DCH       

       MOV DX,12H       

       DIV BX       

       OUT 42H,AL       

       MOV AL,AH       

       OUT 42H,AL       

       IN AL,61H       

       OR AL,03H       

       OUT 61H,AL       

       RET

MIDO ENDP

 

DELAY PROC       

       MOV DX,01FFH

       DEL1:  

       MOV CX,0FFFFH

       DEL2:  

       LOOP DEL2       

       DEC DX       

       JNZ DEL1       

       RET

DELAY   ENDP

 

CODES ENDS

    END MAIN

 

六、体会

1.汇编程序中第一次向用高级语言一样制作一个小程序,调用模块的思想去调用子程序,既有效率,又方便调用和修改,使得整个程序更加简洁明了;

2.在编写程序过程中,子程序的分开测试更利于最后的总体合成;

3.首次运用了获取系统当前时间和发声的中断,对与这些不明白的知识,通过资料的查找,使我对汇编语言有了更多的认识;

4.程序框图是构造整个框架的好方法,值得以后编写代码时候借鉴。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值