汇编 实验 闹钟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档