北邮微机原理中断程序报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京邮电大学实验报告
题目:微机原理软件实验
学院:信息与通信工程
专业:信息工程______
中断实验报告
一、实验目的
1、初步掌握中断程序的设计方法;
2、初步掌握修改 DOS 系统中断,以适应实际使用的方法。
二:实验要求
编一程序,在显示器上显示时、分、秒。
1:借用计数器8253的Timer0作为中断源,通过8259A下向CPU发中断,每10ms 产生一次中断。
2:在中断服务程序中管理刷新时、分、秒。
3:输入文件名(如:CLK)后清屏显示
Current time is XX:XX:XX(时分秒键盘输入)
打回车,时、分、秒开始计时,时钟不停的刷新。
4:当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。
提示:
1、8253的初始化程序段可借用。
2、口地址为40H、41H、42H、43H,控制字为36H=00110110B
3、时间常数TC=11932:1.1932MHz/11932=100Hz,输出方波频率为100Hz,其周期为1000/100=10ms
三:设计思路
这个实验需要用到中断控制器8259A和计数器8253。我们先初始化8253的工作方式,利用工作方式3来计数时间,让其分频后产生100hz的方波,每100个周期即为1s,将这个方波作为中断源,通过8259A每10ms向CPU发出一次中断。然后我们将子程序Timer0的地址(CS以及IP)设置为中断向量,每次中断即执行这个子程序,在这个之程序中编写相应代码,看时间是否到1S,没到则跳出中断,等待下一次(1ms之后)中断到来,到1S则让时间+1并且重置计数值,再加上相应的时间显示程序,这样即可实现时间的自动增加与显示,可以当做一个计时器来用,这即是这个工程的主体部分。
除此之外,还需要一部分程序来实现键盘输入相应时间,这里要注意时间的每一位都有取值方面的要求,这里就要通过一系列的CMP/JMP指令的组合来达到正确输入的效果,将顺序输入的时间存储起来,配合Timer0子程序即可输出当前设置的时间并且实现时间刷新。当然,如果选择不输入时间直接回车的话,程序可以从0开始计时,可以当成一个秒表。
还有一些细节的设计如在计时过程中输入S可以重新设置时间,Ctrl+C可以退出这些也是利用CMP/JMP组合来实现。最后整个程序可以实现以下功能:可以设置开始时间然后自动计时,也可以当做秒表来使用,可以正常退出。
四:实验流程
否
是
是
否
是
否
否
是
中断流程:
否是否
五:实验结果
执行程序,输入格式不对时有错误提示:直接按回车,清屏后进入秒表计时模式:
按下S后重新设置时间为12:34:10后开始计时:
计时时按回车可以保存当前时间:
利用ctrl+c退出:
六:实验总结
这次综合实验是很有难度的,它不仅需要对汇编语言有一定层次的了解,还需要对8259A与8253这两个硬件的工作方式很熟悉。通过不断的查找资料,参考学习,我终于完成了这次实验,在这个过程中我经历了许多也学习到了许多。首先得到提升的是我的debug能力,编的越多能力也就越强。除此之外,我对课本上学习到的微机原理有了更直观与深层次的了解,这对我使用计算机以及今后的学习都是非常有帮助的,最后,感谢这次实验给我带来的宝贵的经历。
附录(源代码与子程序清单)
data segment
count100 db 100 ;100个10ms=1s,此处起计数作用
msg1 db 'Please enter the current time(XX:XX:XX)!(Press ENTER to use default time)$'
msg2 db 'Input Error,please use the correct format!$'
msg3 db 'Now, the time is:',0ah,'(Press Ctrl+C to EXIT.)',0ah,'(Press Enter to use as a Stopwatch.)',0ah,'(Press S or s to set current time again.)(XX:XX:XX)$'
msg4 db 0ah,'Program EXIT.$'
tenhour db '0' ;小时十位数
hour db '0',':' ;小时个位数
tenmin db '0' ;分钟十位数
minute db '0',':' ;分钟个位数
tensec db '0' ;秒十位数
second db '0' ;秒个位数
data ends
stack segment stack 'stack'
db 256 dup(0)
stack ends
code segment
assume cs:code,ds:data,es:data
start: movax,seg data
moves,ax
movds,ax
cli ;置中断标志IF=0
mov al,8 ;保存源中断向量,8中断为定时器
mov ah,35h ;取中断向量,al为中断类型,ES:BX为中断向量
int 21h
push bx
mov ax,0
moves,ax ; es置零,这是准备中断向量的写入
mov di,20h
movax,offset Timer0 ;中断子程序timer的偏移量
stosw ;字符串填充,将AX的内容;(timer偏移量)存入di所
指向的单元,;di的增减取决于DF,默认段基址总是ES movax,cs
stosw ;timer端基址
mov al,36h
out 43h,al ;设置8253控制字为36H
mov bx,11932 ;分频系数为11932,分频结果1.1932MHz/11932=100Hz,10ms 变化一次
moval,bl ;分两次设置分频系数
out 40h,al
moval,bh
out 40h,al
mov al,0fch ;主PIC端口设置为0fch
out 21h,al
sti ;开中断,允许外部中断
movax,seg data
moves,ax
movds,ax
movdx,offset msg1 ;打印提示信息1
mov ah,09h
int 21h
mov dl,0ah ;回车
mov ah,02h
int 21h
settime:movsi,offsettenhour ;设定时间
mov ah,01h
int 21h
cmp al,0dh
jz forever1