

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 8/8北邮微原作业中断实验与编程 微原第二次软件实验 一、实验要求 编写一程序,在显示器上显示时、分、秒。具体要求如下: 1)借用计数器8253的Timer()作为中断源,通过8259A向CPU发中断,每10ms产生 一次中断; 2)在中断服务程序中管理刷新时、分、秒; 3)输入文件名后清屏显示:Current time is : XX:XX:XX(时、分、秒键盘输入); 4)当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。 二、设计思路 1)数据段定义四个字符串,分别用于显示程序功能、提示用户输入,显示当前时间以 及错误格式输入提示。同时定义六个变量用于存储当前显示的的时、
2、分、秒的十位 及个位,一个变量count100用以中断计数; 2)在BIOS功能调用中,令AH=6,设置窗口左上角、右下角行列位置使当前页上滚, 从而实现程序一开始的清屏功能; 3)提示用户输入起始时间时,需要对输入格式进行判断,严格要求输入在00:00:00 至23:59:59,正确输入时则存入相应的变量中,输入任意键开始计时,错误时则屏 幕显示输入错误,提示用户重新进行输入,若输入为“CTRL+C”时退出程序; 4)利用8253作为中断源,输入控制字36H,时间常数为11932,使其选用通道0计 数,产生频率100Hz的方波,即中断100次时间间隔为1s,时间刷新显示; 5)8253中断源
3、每中断一次,进入timer中断子程序,将其段基地址及段内偏移量存入 中断向量表,利用8259向CPU发出中断; 6)timer子程序会对中断次数进行判断,每中断满100次时根据当前时间进行相应的 时、分、秒修改,若不满100次时直接退出中断; 7)屏幕显示时将时、分、秒的十位和个位分别送人al中,在BIOS功能调用中令ah=14h, 实现将al中的字符写到光标位置,并将光标进一,8次循环直到时钟完全显示,同 时比对second,中断满100次时,即时间间隔1s时second变化,当检测到这一变 化时重新进入disp刷新显示; 8)在每秒变化需要刷新显示时,都先进行键盘输入判断,当有输入且输入为
4、“ctrl+c” 时,退出程序。 三、程序流程 1)主要程序流程图 2)中断程序流程图 四、源代码 data segment count100 db100 tenhour db0 hour db0,: tenmin db0 minute db0,: tensec db0 second db0 s1 db(00:00:0023:59:59 Ctrl+C to exit key to start)$ s4 dbStarting time is:$ s2 db(Ctrl+C to exit)Current time is:$ s3 db Error!,0dh,0ah,$ data ends stac
5、k segment stack db256dup(0) stack ends ;回车换行宏定义 CRLF MACRO mov ah,02h mov dl,0dh int21h mov dl,0ah int21h ENDM code segment assume ds:data,cs:code,ss:stack start:mov ax,data mov ds,ax mov es,ax ;清屏 mov al,0;整个窗口为空白 mov ch,0;窗口左上角的行位置 mov cl,0;窗口左上角的列位置 mov dh,24;窗口右下角的行位置 mov dl,79;窗口右下角的列位置 mov bh,
6、7;正常显示属性 mov ah,6;当前显示页上滚功能调用号 int10h;I/O中断调用 begin: mov dx,offset s1 mov ah,09h;程序提示 int21h CRLF mov dx,offset s4 mov ah,09h;提示输入 int21h mov bp,0;分输入正确后加一,跳转为秒输入判断mov di,offset tenhour mov ah,01h int21h cmp al,03h jnz goon1 ;读取第一位,不为ctrl+c则继续键入mov ah,4ch int21h goon1: mov bl,0;第一位为0到2 cmp al,bl jl
7、tiaoban mov bl,2 cmp al,bl jg tiaoban movdi,al;存入tenhour mov bh,al inc di mov ah,01h int21h cmp al,03h jnz goon2 ;读取第二位,不为ctrl+c则继续键入mov ah,4ch int21h goon2: cmp bh,2;如果第一位为2,则第二位为0到3 je tenhour2 mov bl,0;第二位为0到9 cmp al,bl jl tiaoban mov bl,9 cmp al,bl jg error movdi,al;存入hour jmp nextchar tiaoban:
8、jmp error ;用于跳转 tenhour2: mov bl,0 cmp al,bl jl error mov bl,3 cmp al,bl jg error movdi,al nextchar: inc di mov ah,01h int21h cmp al,03h jnz goon3 ;读取第三位,不为ctrl+c则继续键入mov ah,4ch int21h goon3: mov bl,:;第三位为: cmp al,bl jne error inc di mov ah,01h int21h cmp al,03h jnz goon4 ;读取第四位,不为ctrl+c则继续键入mov ah,
9、4ch int21h goon4: mov bl,0;分、秒均为00-59 cmp al,bl jl error mov bl,5 cmp al,bl jg error movdi,al;存入tenmin或tensec inc di mov ah,01h int21h cmp al,03h jnz goon5 ;读取第五位,不为ctrl+c则继续键入mov ah,4ch int21h goon5: mov bl,0 cmp al,bl jl error mov bl,9 cmp al,bl jg error movdi,al;存入minute或second inc bp cmp bp,1;bp
10、为1则继续读取秒钟输入 je nextchar signal: mov ah,0bh;输入任意键开始计时 int21h or al,al jz signal ;无输入继续检测,有输入才开始 CRLF ;换行回车 jmp init error:mov dx,offset s3 mov ah,09h int21h;显示错误提示信息 JMP begin ;重新读取 init: cli;关中断 mov ax,0 mov es,ax;置附加段基地址为0 mov di,20h;中断号08h*4 mov ax,offset timer ;中断程序的段内偏移量 stosw;偏移量存入中断向量表 mov ax,
11、cs;中断程序段基地址 stosw;段基地址存入中断向量表 mov al,36h;选用0通道计数器,采用3号方式(方波)计数out43h,al mov bx,11932;时间常数,输出100HZ方波 mov al,bl out40h,al mov al,bh out40h,al mov al,0fch out21h,al;21h端口为中断屏蔽寄存器,用以开发外部中断 sti;开中断 ;屏幕显示当前时间,变化时刷新显示 disp: mov ah,0bh int21h or al,al jz noexit ;系统无输入时不退出 mov ah,08h int21h cmp al,03h jnz no
12、exit mov ah,4ch int21h noexit: mov dx,offset s2 mov ah,09h int21h mov bx,offset tenhour mov cx,8 dispclk: mov al,bx call dispchar inc bx loop dispclk ;时分秒存入al并显示 mov al,0dh call dispchar mov al,second ;时间变化时秒个位必变化 next: cmp al,second je next ;无变化时循环 jmp disp ;有变化时刷新显示 ;中断一百次即为1s,时间相应变化 timer proc fa
13、r push ax dec count100 jnz timerx mov count100,100 inc second cmp second,9;小于等于9,即之前秒个位为0-8 jle timerx ;秒个位0-8,变化后秒个位加1显示即可mov second,0;原个位为9,变化后为0 inc tensec cmp tensec,6 jl timerx ;加1后小于5,即原秒十位为0-4,十位加1即可显示mov tensec,0 inc minute ;与秒同理 cmp minute,9 jle timerx mov minute,0 inc tenmin cmp tenmin,6 j
14、l timerx mov tenmin,0 inc hour cmp tenhour,2 jl nexth cmp hour,3 jle timerx mov hour,0 mov tenhour,0 jmp timerx nexth: cmp hour,9 jle timerx adjhour: inc tenhour mov hour,0 timerx: mov al,20h out20h,al pop ax iret;中断退出 timer endp dispchar proc push bx mov ah,14;写字符到光标位置,光标位置加1 int10h pop bx ret disp
15、char endp code ends end start 五、子程序清单 1)子程序名:timer; 功能:判断中断计数是否满100次,若已满对时间做出相应的修改; 入口参数:无; 出口参数:无; 使用寄存器:AX,FR。 2)子程序名:dispchar; 功能:写入相应字符至光标位置,并将光标前进一位; 入口参数:al,用以存储待写入的字符; 出口参数:无; 使用寄存器:AX,BX。 六、程序分析 1)本程序一开始利用INT 10H进入BIOS功能调用,通过当前页上滚实现清屏功能, 采用用户键入得到现行时钟起始值,利用INT 21H读取用户键盘输入,等待用户正 确输入后开始计时; 2)利用
16、8253作为中断源,43H端口是8253三通道定时器中的命令寄存器,所使用的 命令字36H表示选用0通道定时器,以3号方式(产生方波)计数。向端口40H 送出的计数器初值选用11932是要求8253每秒发出100次时钟中端(08H),将本 程序中的timer的起始地址送入中断的入口地址,保证每次发生08H中断时,程序 自动进入timer; 3)程序运行的大体过程为:主程序显示时钟值,发生中断08H时进入timer,查看中 断计数是否达到100次,若没有达到次数直接退出中断返回主程序;若已达到,则 时间又过了1s,对个数据进行修改后返回主程序; 4)本程序的时钟显示范围是00:00:00至23:59:59,因而在计时至23:59:59时,下一秒 将时间修改为00:00:00,针对不同的时间改变过程,程序中做了对应的修改,已保
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件无偿借用合同协议
- 道路黑化工程合同协议
- 农村生态环境保护与农业发展协同协议
- 车队用工协议书范本
- 沥青环保协议书
- 无权处分协议书
- 实验仪器设备维修维护协议
- 车辆装潢招标合同协议
- 沙场干股协议书
- 远程影像会诊协议合同
- 破产法试题及答案
- 宪法卫士2023第八届全国学生学宪法讲宪法知识竞赛题库附答案(300题)
- 静脉输液不良反应及处理 课件
- 河南省开封市等2地2025届高三第三次质量检测英语+答案
- 乡土中国的性别差异
- 高速铁路概论单元高速铁路发展概况课件
- 北师大版2025三年级语文下学期期中课堂知识检测考试
- 2024年甘肃兰州事业单位招聘考试真题答案解析
- 宁波浙大宁波理工学院招聘13名事业编制工作人员笔试历年参考题库附带答案详解
- 精神科医疗质量指标十二项控制评价体系
- 延安精神知识讲座课件
评论
0/150
提交评论