实验目的
- 分析和理解指定的需解决的问题
- 利用LC-3的汇编代码设计实现相关程序
- 通过LC-3仿真器调试和运行相关程序并得到正确的结果
实验内容
-
实验背景:
在计算机科学中,一个中断就是有硬件和软件发起的一个事件,表明需要立即处理。
高优先级的条件下一个中断通知处理器需要中断正在运行的程序,处理器挂起正在处理的行为,保存执行程序的状态,然后执行一个小的中断处理程序(中断服务程序)来处理事件。
中断是临时的,当处理器执行完中断处理程序后,处理器继续执行之前被中断的程序,中断分硬件中断和软件中断。 -
实验描述:
表明中断驱动的输入、输出可以中断一个正在运行的程序,执行中断服务程序,返回被中断的程序,从被中断位置下一个地址继续执行(好像什么也没发生似的)。实验中使用键盘作为输入设备,中断正在运行的程序。
实验任务:
A.用户程序
用户程序将会包含连续地输出纵横交替的ICS,通过交替输出两个不同行,如下:
ICS ICS ICS ICS ICS ICS
ICS ICS ICS ICS ICS
ICS ICS ICS ICS ICS ICS
ICS ICS ICS ICS ICS
ICS ICS ICS ICS ICS ICS
ICS ICS ICS ICS ICS
ICS ICS ICS ICS ICS ICS
ICS ICS ICS ICS ICS
确保输出不至于太快,以至于肉眼不能察觉。用户程序应该包含以小段代码用于每行间的计数,间隔为从25000开始倒计时输出在屏幕上。
B.键盘中断服务程序
键盘中断服务程序将会简单地在屏幕上写上十次,用户随机输入的字符并以Enter(x0A)结束。
中断服务程序中不能使用TRAP指令。如在屏幕上显示一个字符,必须检测先DSR寄存器,然后写进DDR寄存器,并且也不可以调用 TRAP x21(OUT),或者其它TRAP程序。
注意,不要忘记保存和恢复服务程序中使用的那些寄存器。
C.操作系统支持的代码
LC-3上没有安装windows或Linux,所以必须要求在用户程序代码前先做到以下三个步骤。
1.正常情况下,操作系统将会先安装一些栈空间,所以当中断发生的时候 PC和PSR可以被放进栈中(当程序执行RTI,PC和PSR都会被弹出栈,处理器返回到执行被中断的程序)由于没有操作系统,请先把R6初始化为x3000,表示一个空的栈。
2.正常情况下,操作系统会建立中断向量表,它包含对应中断服务程序的起始地址,你必须为键盘中断先建立一个中断向量表。中断向量表的开始地址是x0100,键盘中断的中断向量是x80。你必须在中断向量表提供一个入口供本实验使用。
3.操作系统应该设置KBSR的IE(Interrupt Enable)位,这个也由你实现。
实验注意:
1.Linux LC-3模拟器不包括支持中断,因此你必须使用windows LC-3模拟器。
2.请参考课本第八章8.5 第10章,附录A
3.无需对超级栈进行PUSH和POP的操作(这个是由硬件完成的)
4. 两个文件汇编生成的OBJ文件都需要导入,注意先后次序,让PC=X3000
5.中断服务程序不可以使用TRAP,使用轮询方式。当有字符输入时就进入中断服务程序,a)然后直接退出中断服务程序,或者b)当输入ENTER才会退出中断服务程序。
实现代码
用户程序
注意:二至六行是重点
.ORIG X3100
LD R6, STACK
LD R2, INT ;载入中断程序地址至R2
STI R2, INVT ;将R2载入键盘中断向量表x0180
LD R2, num
STI R2, KBSR ;将KBSR第14位IE位赋1
START LEA R0, ROW1 ;分别输出第1行和第2行并延迟
PUTS
JSR DELAY
LEA R0, ROW2
PUTS
JSR DELAY
BRnzp START
STACK .FILL X3000
INVT .FILL X0180
INT .FILL X2000
KBSR .FILL XFE00
num .FILL X4000
ROW1 .STRINGZ "ICS ICS ICS ICS ICS ICS\n"
ROW2 .STRINGZ " ICS ICS ICS ICS ICS \n"
DELAY ST R1, SaveR1 ;延迟函数
LD R1, COUNT
REP ADD R1,R1,#-1
BRp REP
LD R1, SaveR1
RET
COUNT .FILL #25000
SaveR1 .BLKW 1
.END
中断程序
.ORIG X2000
ST R0, SAVE0
ST R1, SAVE1
ST R2, SAVE2
LDI R0, KBDR
ADD R1, R0, -10
BRz OVER
ASK1 LDI R1, DSR ;轮询输出设备(事实上可免)
BRzp ASK1
INIT AND R2, R2, 0 ;将R2赋10
ADD R2, R2, 10
LOOP STI R0, DDR ;输出字符10次
ADD R2, R2, -1
BRp LOOP
ASK2 LDI R1, KBSR ;轮询输入设备,是否有新字符
BRzp ASK2
LDI R0, KBDR
ADD R1, R0, -10 ;若不为ENTER,打印该字符10次
BRnp INIT ;否则输出后退出
STI R0, DDR
OVER LD R0, SAVE0
LD R1, SAVE1
LD R2, SAVE2
RTI
SAVE0 .BLKW 1
SAVE1 .BLKW 1
SAVE2 .BLKW 1
ENTER .FILL X0A
BLANK .FILL X20
KBSR .FILL XFE00
KBDR .FILL XFE02
DSR .FILL XFE04
DDR .FILL XFE06
.END
对你有帮助的话点个赞叭