深圳大学 计算机系统(1) 实验报告6 中断实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深圳大学实验报告
课程名称计算机系统1 项目名称 LC-3 中断实验
学院计算机与软件学院
专业
指导教师
报告人学号
实验时间 2017年5月19日
提交时间 2017年5月19日
教务处制
一、实验目的与要求
(1)实现中断程序
(2)不调用trap,实现字符的输入与输出
二、实验内容与方法
试验要求:
用户程序将会连续地输出纵横交替的ICS,通过交替,输出两个不同行,如下:
然后按下键盘上任一字符,程序自动启动中断子程序。键盘中断服务程序将会简单地在屏幕上写上十次用户随机输入的字符并以Enter(x0A)结束。
主程序起始位置为x3000,中断子程序起始地址为x2000 。
试验方法:
本实验主要分为以下三部分程序:
A. 用户程序
B. 键盘中断服务程序
C. 操作系统支持的代码
三、实验步骤与过程
用户程序:
用户程序主要是实现如下字符串的输出。最外面是一个死循环,里面两个小循环,一个循环输出一行(当然也可以只用一个小循环实现,但需要引入变量,比原方案复杂一点)。由于程序运行非常快,为了让字符串缓慢输出,在每次输出“ICS ”或者“ ICS”时,添加一个延迟子函数。
C++实现如下:
键盘中断服务程序
中断服务程序其实就相当于主函数的一个子函数,只不过不是用户来调用,而是由系统自己来调用。
输入字符先要检查KBSR(键盘状态寄存器)是否被最高位被置为1,若是被置为1,则将KBDR中的数据加载到寄存器中(此时该寄存器中存的值就是输入字符)。
输出字符时,先要检查DSR最高位是否被置为1,若被置为1,则说明可进行输出。
此时将要输出的字符加载到DDR中,屏幕上便会显示该字符。
操作系统支持的代码
系统支持主要有以下几个方面:
1)设置栈指针:将R6初始化成x4000即可;
2)建立中断向量表:键盘中断的中断向量是x80,在内存中地址为x0180,在x0180中存入中断子程序的起始地址x2000即可;
3)设置KBSR的IE(Interrupt Enable)位。IE位为第14为,只需在KBSR,即地址xFE00中存入x4000即可。
最终程序见附件。
调试:
主函数输出如下,很显然出了问题。
经检查,发现是如下语句错误,应该是加载标号所在的地址,而不是地址中所放的值,将该语句改为LEA R0,BLANK2即可,而函数中其他类似指令也做如此修改。
发生中断后,出现下图现象:
经检查,发现是由于将R1错打成R4,造成了以上结果。
四、实验结论或体会
调试完成后,运行结果如下:
该程序会一直循环输出如下两串字符,直到在键盘中任意按下一个字符后,会在屏幕上输出10次按下的字符并以换行结束。下图就是随意输入字符造成的结果。
经测试,所写程序满足实验要求。
实验感悟:
1) 经过一学期的训练,现在写汇编程序已经不像原来那样生涩,已经能够比较熟练的写出一般难度的汇编程序;
2)程序的流程很好把握,毕竟程序本身不难。但是汇编程序比较注重细节,有时细节实现比较麻烦。细节比较容易出错,可能是我比较粗心?比如寄存器编号打错,相似指令用错。所以写程序还是要细心。
3)经过本次试验,我对于如何实现字符的输入与输出、中断程序如何实现有了更深一步的了解。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。