汇编闹钟程序



一、实验目的

《汇编语言程序设计》是计算机专业重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握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.程序框图是构造整个框架的好方法,值得以后编写代码时候借鉴。

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
scau汇编综合性实验是一个非常有趣的项目,其中有一个实现在屏幕上移动的“蛇”的任务。我们可以使用汇编语言的指令来控制屏幕的输出和键盘输入。 首先,我们需要定义一个表示“蛇”的数据结构。可以使用一个数组来储存蛇的位置信息,每个元素表示一个身体部位的坐标。我们还需要定义一个变量来表示蛇的长度。 接下来,我们需要在屏幕上绘制“蛇”。我们可以使用汇编语言的命令来控制屏幕的像素,实现绘制功能。首先,我们需要清空屏幕上的内容,然后将“蛇”的每个身体部位的坐标对应的像素点设为特定颜色。 在屏幕上移动“蛇”的思路是,通过监听键盘输入来控制“蛇”的移动方向。当用户按下箭头键的时候,我们通过改变蛇头的坐标来实现移动。之后,我们还需要更新蛇身体的坐标信息,最后再次绘制“蛇”。 同时,要确保蛇的移动过程中不会碰到屏幕边界或者自身身体的其他部位。如果蛇头碰到屏幕边界或者自身身体的其他部位,游戏结束。 在游戏进行过程中,还可以加入一些额外的功能,比如蛇吃到食物后身体加长,每移动一步更新分数等。 这个“蛇”的移动实验可以让我们深入理解汇编语言的编程思想,锻炼我们的逻辑思维和创造力。同时,通过这个实验,我们可以将计算机相关知识与生活中的游戏联系起来,更加直观地感受到计算机的奇妙之处。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值