汇编 实验 闹钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
一、实验目的
《汇编语言程序设计》是计算机专业重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握8088宏汇编语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。
二、实验要求
1.从键盘输入闹铃时间(如2分钟)
2.程序开始记时,并在屏幕上显示时间(如00:00:01)并实时刷新
3.时间到,则发出闹铃声,声音维持数秒;同时时间停止刷新
三、实验原理分析
这个程序总共有个部分,分别是输入输出、时间处理、发出警报。
输入用DOS 1号功能实现再判断输入是否正确;输出需要注意光标位置,用BIOS 2号、3号功能分别实现设置光标位置、获取光标位置。
时间处理上,由于本机子是2.80GHz,所以循环执行nop指令26h*9999h次的时间十分接近1s,但少于1s,所以每次刷新时间都执行这个,可以避免频繁存取内存等操作。利用DOS 2ch 功能号即可获取系统时间。
对于警报,操作61h端口实现对扬声器的控制,对第1位置1则发声,置0则停止。
四、流程图
1、子程序功能介绍
output_decimal_number_in_ax : 输出保存在ax的十进制数
output_separtor:输出保存在dx的字符串
get_date 获取日期
output_date 输出日期
get_time 获取时间,时间为时分秒,存放在堆栈
output_time 输出时间,时间为时分秒,存放在堆栈
input_ 输入要定时的分钟数,in_minute在堆栈限制大小:
get_deadline 根据输入的分钟及当前的时间,得到响铃时间,堆栈push顺序:deadline、in_minute calculate_rest_time 计算剩余时间的分/秒,堆栈push顺序:保存结果的地址、减数
五、源程序(加必要注释,要有程序运行的截图。)
1、源程序
.model small
.stack 100h
.data
now_date dw ?,?,?,? ;当前日期
now_time dw ?,?,? ;当前时间
deadline dw ?,?,? ;响铃时间
rest_time dw ?,?,? ;剩余时间
in_minute dw 0000h ;输入
too_big dw 0000h ;标志,0--正常,1--太大,2--退出程序
cursor_first dw ? ;光标初始位置
separtor_time db ':$' ;输出时间时的分隔符
separtor_date db ' $' ;输出日期时的分隔符
separtor_crlf db 0dh,0ah,'$' ;换行
input_inf db 'Please input the time when ringing later, mintue',0dh,0ah db 'or press q if you want to quit: $'
too_big_inf db 'the number inputed is too big! $'
input_error_inf db 'Your are supposed to input the minutes. $'
deadline_inf db 'The dead $'
now_time_inf db 'Now it is $'
rest_time_inf db 'I will ring after $'
blank db ' ',0dh,0ah,'$' .code
main proc far
start:
mov ax,@data
mov ds,ax
;得到光标的初始位置
mov bh,00h
mov ah,03
int 10h
mov cursor_first,dx
jmp input_the_time
;输入后判断too_big,若太大则跳到此处
;重置光标位置,并清屏,输出相应信息
output_too_big_inf:
mov dx,cursor_first
mov ah,02h
mov bh,00h
int 10h
lea dx,too_big_inf
call output_separtor
lea dx,separtor_crlf
call output_separtor
;初始化参数,接收输入
input_the_time:
mov too_big,word ptr 0000h
lea dx,input_inf
call output_separtor
lea ax,in_minute
push ax
lea ax,too_big
push ax
call input_
;隐藏光标
mov cx,2000h
mov ah,01h
int 10h
;清屏
mov dx,cursor_first
mov ah,02h
mov bh,00h
int 10h
lea dx,blank
call output_separtor
call output_separtor
call output_separtor
call output_separtor
;验证 0--正常,1--太大,2--退出程序
cmp too_big,0001h
jb check_input_zero
ja jmp_to_exit
jmp output_too_big_inf
jmp_to_exit:
jmp to_exit
check_input_zero:
cmp in_minute,0000h
jne next_step_gain_the_deadline