北邮微机原理中断程序报告.docx
- 文档编号:26750287
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:20
- 大小:216.29KB
北邮微机原理中断程序报告.docx
《北邮微机原理中断程序报告.docx》由会员分享,可在线阅读,更多相关《北邮微机原理中断程序报告.docx(20页珍藏版)》请在冰豆网上搜索。
北邮微机原理中断程序报告
北京邮电大学实验报告
题目:
微机原理软件实验
学院:
信息与通信工程
专业:
信息工程______
中断实验报告
一、 实验目的
1、 初步掌握中断程序的设计方法;
2、 初步掌握修改 DOS 系统中断,以适应实际使用的方法。
二:
实验要求
编一程序,在显示器上显示时、分、秒。
1:
借用计数器8253的Timer0作为中断源,通过8259A下向CPU发中断,每10ms
产生一次中断。
2:
在中断服务程序中管理刷新时、分、秒。
3:
输入文件名(如:
CLK)后清屏显示
CurrenttimeisXX:
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能力,编的越多能力也就越强。
除此之外,我对课本上学习到的微机原理有了更直观与深层次的了解,这对我使用计算机以及今后的学习都是非常有帮助的,最后,感谢这次实验给我带来的宝贵的经历。
附录(源代码与子程序清单)
datasegment
count100db100;100个10ms=1s,此处起计数作用
msg1db'Pleaseenterthecurrenttime(XX:
XX:
XX)!
(PressENTERtousedefaulttime)$'
msg2db'InputError,pleaseusethecorrectformat!
$'
msg3db'Now,thetimeis:
',0ah,'(PressCtrl+CtoEXIT.)',0ah,'(PressEntertouseasaStopwatch.)',0ah,'(PressSorstosetcurrenttimeagain.)(XX:
XX:
XX)$'
msg4db0ah,'ProgramEXIT.$'
tenhourdb'0';小时十位数
hourdb'0',':
';小时个位数
tenmindb'0';分钟十位数
minutedb'0',':
';分钟个位数
tensecdb'0';秒十位数
seconddb'0';秒个位数
dataends
stacksegmentstack'stack'
db256dup(0)
stackends
codesegment
assumecs:
code,ds:
data,es:
data
start:
movax,segdata
moves,ax
movds,ax
cli;置中断标志IF=0
moval,8;保存源中断向量,8中断为定时器
movah,35h;取中断向量,al为中断类型,ES:
BX为中断向量
int21h
pushes
pushbx
movax,0
moves,ax;es置零,这是准备中断向量的写入
movdi,20h
movax,offsetTimer0;中断子程序timer的偏移量
stosw;字符串填充,将AX的内容;(timer偏移量)存入di所指向的单元,;di的增减取决于DF,默认段基址总是ES
movax,cs
stosw;timer端基址
moval,36h
out43h,al;设置8253控制字为36H
movbx,11932;分频系数为11932,分频结果1.1932MHz/11932=100Hz,10ms变化一次
moval,bl;分两次设置分频系数
out40h,al
moval,bh
out40h,al
moval,0fch;主PIC端口设置为0fch
out21h,al
sti;开中断,允许外部中断
movax,segdata
moves,ax
movds,ax
movdx,offsetmsg1;打印提示信息1
movah,09h
int21h
movdl,0ah;回车
movah,02h
int21h
settime:
movsi,offsettenhour;设定时间
movah,01h
int21h
cmpal,0dh
jzforever1
cmpal,'0'
jcerror2;如果输入不合法,报错
cmpal,'3'
jncerror2
mov[si],al
incsi
cmpal,'2'
jzershi
movah,01h;如果小时高位为1,低位可以设置0~9
int21h
cmpal,0dh
jzforever1
cmpal,'0'
jcerror2
cmpal,'9'+1
jncerror2
mov[si],al
incsi
jmpfen
ershi:
movah,01h;如果小时高位为2,低位可以设置0~4
int21h
cmpal,0dh
jzforever1
cmpal,'0'
jcerror2
cmpal,'4'
jncerror2
mov[si],al
incsi
jmpfen
fen:
movah,01h;分高位可设置0~5
int21h
cmpal,0dh
jzforever1
cmpal,':
'
jnzerror1
mov[si],al
incsi
movah,01h
int21h
cmpal,0dh
jzforever1
cmpal,'0'
jcerror1
cmpal,'6'
jncerror1
mov[si],al
incsi
zcy4:
movah,01h;分低位0~9
int21h
cmpal,0dh
jzforever1
cmpal,'0'
jcerror1
cmpal,'9'+1
jncerror1
mov[si],al
incsi
jmpzcy
settime2:
jmpsettime;用来跳转接力
error2:
jmperror1
forever1:
jmpnext2
zcy:
movah,01h;秒高位可设置0~5
int21h
cmpal,0dh
jzforever1
cmpal,':
'
jnzerror1
mov[si],al
incsi
movah,01h
int21h
cmpal,0dh
jzforever1
cmpal,'0'
jcerror1
cmpal,'6'
jncerror1
mov[si],al
incsi
movah,01h;秒低位可设置0~9
int21h
cmpal,0dh
jzforever1
cmpal,'0'
jcerror1
cmpal,'9'+1
jncerror1
mov[si],al
incsi
jmpnext2
error1:
movdl,0ah;用来报错:
设置时间不合法
movah,02h
int21h
movdx,offsetmsg2;打印提示信息2
movah,09h
int21h
movdl,0ah
movah,02h
int21h
jmpsettime
settime3:
jmpsettime2;跳转接力
next2:
MOVAX,0003H;做时钟显示初始化
INT10H;清屏显示
movdl,0ah
movah,02h
int21h
movdx,offsetmsg3;打印提示信息3
movah,09h
int21h
movdl,0ah
movah,02h
int21h
forever:
movbx,offsettenhour;这个程序段循环执行
movcx,8
cmptenhour,'2';如果超过24点,置为0点
jnzdispclk
cmphour,'4'
jnzdispclk
movtenhour,'0'
movhour,'0'
dispclk:
movdl,[bx];用来显示当前时间
calldispchar
incbx
loopdispclk;调用显示子程序,显示初始状态时间,;比如”11:
11:
11"
movdl,0dh;输出一个换行
calldispchar
xoral,al;读键盘缓冲区
movah,0bh
int21h
cmpal,0FFH
jnznext3
movah,08h;取其字符
int21h
cmpal,03h;Ctrl+C退出
jzstop
cmpal,'s';S/s设定时间
jzsettime3
cmpal,'S'
jzsettime3
cmpal,0dh
jnznext3
movdl,0ah;回车则使用秒表功能
movah,02h
int21h
jmpforever
next3:
moval,second
next:
cmpal,second;判断second是否发生变化
jenext;如果没有,循环比较
jmpforever;如果有变化,刷新输出
stop:
movdx,offsetmsg4;打印提示信息4
movah,09h
int21h
movdl,0ah
movah,02h
int21h
popdx;恢复中断向量
popds
moval,8
movah,25h;25H设置中断向量
int21h
movah,4ch
int21h
Timer0procfar;中断程序timer
pushax
deccount100;计数100次
jnztimerx;如果计数小于100,跳出中断
movcount100,100;否则重置count100<=100
;1s已经到达
incsecond;加一秒
cmpsecond,'9';判断大小,用于进位,以下原理相同
jletimerx
movsecond,'0'
inctensec
cmptensec,'6'
jltimerx
movtensec,'0'
incminute
cmpminute,'9'
jletimerx
movminute,'0'
inctenmin
cmptenmin,'6'
jltimerx
movtenmin,'0'
inchour
cmphour,'9'
jaadjhour
cmphour,'3'
jnztimerx
cmptenhour,'1'
jnztimerx
movhour,'1'
movtenhour,'0'
jmpshorttimerx;段内短转移
adjhour:
inctenhour
movhour,'0'
timerx:
moval,20h
out20h,al;主PIC口地址
popax;出栈恢复
iret;中断返回
Timer0endp
dispcharprocnear;显示子函数
pushbx;入栈保护
movbx,0
movah,02h
int21h;DOS功能调用,输出DL内容
popbx
ret
dispcharendp
codeends
endstart
子程序清单:
子程序名:
Timer0
功能:
通过计数是否到100次(1s)来控制中断,时间增加
所用寄存器:
AX
入口参数:
无
出口参数:
无
调用其他子程序:
无
子程序名:
dispchar
功能:
显示字符
所用寄存器:
AH,BX,DL
入口参数:
DL
出口参数:
无
调用其他子程序:
无
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 中断 程序 报告