一、实验目的
《汇编语言程序设计》是计算机专业重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握8088宏汇编语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。
二、实验要求
小闹钟:
1.从键盘输入闹铃时间(如2分钟)
2.程序开始记时,并在屏幕上显示时间(如00:00:01)并实时刷新
3.时间到,则发出闹铃声,声音维持数秒;同时时间停止刷新
4.能处理输入错误(如闹铃时间应该为数字,用户输入非数值型的字符则显示错误提示。)
三、实验原理分析
-
设置响铃时间(本程序只精确到分钟)分别设置了小时与分钟两个值。程序运行时,会有提醒输入格式(XX:XX),必须以此格式输出,否则系统判断为错误,并发出警告,提示输入错误。小时的范围首个数字不能大过3,分钟的范围在0-59之间。否则发出警告,提示输入错误。而且中间必须以分号隔开,否则也会出现错误;
-
输入的时间,将分别存储在hour和min两个单元里,并用十进制数字显示出来,以便测试之前的存储是否成功,和方便我们人为的比较;
-
用MOV AH,2CH来获取当前系统的时间,将小时存储在CH中,分钟存储在CL中;
-
调用子程序将获得的当前时间显示出来,并在没有到达响铃时间之前实现不断刷新,且显示出来;
-
当前时间与设置好的时间进行比较,若是小时数与分钟数相同,即到达响铃时间,刷新停止,显示“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.程序框图是构造整个框架的好方法,值得以后编写代码时候借鉴。