一、实验目的
分析和理解指定的需解决问题。
利用LC-3的汇编代码设计实现相关程序。
通过LC-3仿真器调试和运行相关程序并得到正确的结果。
二、实验内容
实验任务包括以下三部分
A.用户程序
B.键盘中断服务程序
C.操作系统支持的代码
A.用户程序
用户程序将会包含连续地输出纵横交替的ICS,通过交替输出两个不同行,确保输出不至于太快,以至于肉眼不能察觉。用户程序应该包含以小段代码用于每行间的计数,间隔为从25000开始倒计时输出在屏幕上。
B.键盘中断服务程序
键盘中断服务程序将会简单地在屏幕上写上十次,用户随机输入的字符并以Enter(x0A)结束。
中断服务程序中不能使用TRAP指令。如在屏幕上显示一个字符,必须检测先DSR寄存器,然后写进DDR寄存器,并且也不可以调用 TRAP x21(OUT),或者其它TRAP程序。
C.操作系统支持的代码
1.正常情况下,操作系统将会先安装一些栈空间,所以当中断发生的时候 PC和PSR可以被放进栈中(当程序执行RTI,PC和PSR都会被弹出栈,处理器返回到执行被中断的程序)由于没有操作系统,请先把R6初始化为x3000,表示一个空的栈。
2.正常情况下,操作系统会建立中断向量表,它包含对应中断服务程序的起始地址,你必须为键盘中断先建立一个中断向量表。中断向量表的开始地址是x0100,键盘中断的中断向量是x80。你必须在中断向量表提供一个入口供本实验使用。
3.操作系统应该设置KBSR的IE(Interrupt Enable)位,这个也要实现。
三、实验步骤与结果
(1)编写用户程序
1.初始化数据
2.打印6个的ICS
3.打印5个的ICS
4.delay子程序
5.数据存储区
代码
.ORIG x3000
LD R6,stack
LD R1,entry
LD R2,start
STR R2,R1,#0
LD R3,IE
STI R3,KBSR
;打印6个的ICS
begin AND R4,R4,#0
ADD R4,R4,#6
print6 BRz enter1
LEA R0,ICS6
PUTS
JSR delay
ADD R4,R4,#-1
BRnzp print6
enter1 LD R0,huiche
OUT
JSR delay
;打印5个的ICS
AND R4,R4,#0
ADD R4,R4,#5
print5 BRz enter2
LEA R0,ICS5
PUTS
JSR delay
ADD R4,R4,#-1
BRnzp print5
enter2 LD R0,huiche
OUT
JSR delay
BRnzp begin
Halt
;子程序delay
delay ST R1,saveR1
LD R1,count
REP ADD R1,R1,#-1
BRp REP
LD R1,saveR1
RET
;数据存储区
stack .fill x3000
entry .fill x0180
start .fill x2000
IE .fill x4000
KBSR .fill xFE00
ICS6 .STRINGZ "ICS "
ICS5 .STRINGZ " ICS"
huiche .fill x000A
count .fill #25000
saveR1 .fill #0
.END
(2)键盘中断服务程序
1.将寄存器的值存入栈中
2.检查键盘的状态并输出
3.结束中断程序
4.数据存储区
代码
.ORIG x2000
ADD R6,R6,#-1
STR R0,R6,#0
ADD R6,R6,#-1
STR R1,R6,#0
ADD R6,R6,#-1
STR R2,R6,#0
ADD R6,R6,#-1
STR R3,R6,#0
;检查键盘的状态并输出
check LDI R1,KBSR
BRzp check
LDI R0,KBDR
ST R0,saveR0
LD R3,huiche
ADD R3,R3,R0
BRz jieshu
AND R2,R2,#0
ADD R2,R2,#10
loop LD R0,saveR0
pan LDI R1,DSR
BRzp pan
STI R0,DDR
ADD R2,R2,#-1
BRp loop
BRnzp check
;结束
jieshu LDR R3,R6,#0
ADD R6,R6,#1
LDR R2,R6,#0
ADD R6,R6,#1
LDR R1,R6,#0
ADD R6,R6,#1
LDR R0,R6,#0
ADD R6,R6,#1
RTI
;数据存储区
saveR0 .fill #0
huiche .fill xFFF6
KBSR .fill xFE00
KBDR .fill xFE02
DSR .fill xFE04
DDR .fill xFE06
.END
(3)运行代码
1.读取程序
2.运行
3.输入 abc
4.输入回车
四、实验结论
达成了本次实验的目标,加深了对中断程序的理解以及使用delay子程序进行延时,以及对于栈区数据的存储和恢复,对lc3有了更加深入的了解和运用
(by 子忆)