汇编闹钟程序

来源:互联网 发布:深入浅出java pdf 编辑:程序博客网 时间:2024/05/16 15:26


一、实验目的

《汇编语言程序设计》是计算机专业重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握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!”,停止刷新,并发出声音

DATASSEGMENT

   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!$'

   ;此处输入数据段代码 

DATASENDS

 

CODESSEGMENT

   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

 

CODESENDS

   END MAIN

 

六、体会

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

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

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

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

0 0
原创粉丝点击