计算机系统 实验5
实验目的:
展示如何让输入输出通过执行中断处理程序的方式来暂停和恢复一个正在运行的程序,恢复后的程序就像中间什么都没有发生过,本实验使用键盘作为输入来中断正在运行的程序。
实验内容与实验要求:
设计实验程序分为三部分:
- 用户程序:
该程序持续间隔的输出两行不同的“ICS”——为了不让屏幕太快的输出以至于看不清每行的内容,该程序需要嵌入一段计数代码,每次从2500递减到0,计数完成,然后输出一行(但实际过程中发现,从2500递减到0,还是会输出太快,所以我用户程序在设计时调用了5次,该子程序,并且子程序是从10000递减到0的)
- 键盘中断处理程序:
该程序每次简单的把用户键入的回车(x0A)之前的字符打印10次。在中断处理程序中,TRAP指令是不能使用的,当需要显示字符时,必须通过读写DSR的方式,也不能用TRAP x21(OUT)和其他的TRAP指令。在中断处理程序中要对用到的寄存器的状态暂存和恢复。
- 操作系统使能代码:
很不幸的是,LC-3上还不能安装Windows 和 Linux ,所以如下工作需要在用户程序中首先完成:
1、通常情况下,当遇到中断发生之前,操作系统已经开辟好栈空间,保存PC和PSR,当执行到RTI时,PC和PSR会被弹栈,因为没有操作系统,需要初始化R6为X3000,指示一个空栈。
2、同样,操作系统会建立一张中断向量表,用来包含中断处理程序对应的起始执行地址,因此,本实验的键盘中断处理程序需要你来做,中断向量表的起始地址为X0100,键盘中断处理程序的起始地址为X80,本实验只需要提供该中断处理程序的地址即可。
3、最后,操作系统会把KBSR的IE(Interrupt Enable) 位置1,所以你也需要这样做。
实验步骤:
一、设计用户程序:
1.先为用户程序设计子程序,用于延时,使输出不至于过快而不可见,代码如下:
DELAY ST R1, DELAYR1
LD R1, COUNT
REP ADD R1,R1,#-1
BRp REP
LD R1, DELAYR1
RET
COUNT .FILL #10000
DELAYR1 .BLKW 1
2.设计用户主程序,使该程序可以持续间隔的输出两行不同的“ICS”——具体操作为:将两行不同的“ICS”用.STRING的存储格式存起来,然后设计一个不终止的循环,循环输出两行不同的“ICS”
代码如下:
LD R6, KBSR
LDR R0,R6,0
LD R1,SHU
NOT R2,R1
ADD R2,R2,1
AND R2,R2,R0
ADD R2,R1,R2
STR R2,R6,0 ; 把KBSR的IE(Interrupt Enable) 位置1
LD R6,KONGZHAN
AND R1,R1,0
ADD R1,R1,1
AND R2,R2,0
ZHUXUN JSR DELAY ;为了提高可见度,调用了5次DELAY
JSR DELAY
JSR DELAY
JSR DELAY
JSR DELAY
ADD R2,R2,1
AND R3,R1,R2
BRz ICS1SHU
LEA R0, ICS2
PUTS ;输出第一行ISC
LD R0, HUANHANG
OUT
BRnzp ZHUXUN
ICS1SHU LEA R0, ICS1
PUTS ;输出第二行ISC
LD R0, HUANHANG
OUT
BRnzp ZHUXUN
ICS1 .STRINGZ “ICS ICS ICS ICS ICS ICS “
ICS2 .STRINGZ “ ICS ICS ICS ICS ICS “
HUANHANG .FILL x000A
KONGZHAN .FILL x3000
KBSR .FILL xFE00
SHU .FILL x4000
3.将该用户程序整合为一个.asm的文件,命名为“实验5 用户程序”,然后进行编译和载入
二、对中断列表地址进行载入:
设计在X0180处存入X2000,用于顺利实现进键盘的中断,代码如下:
.ORIG x0180
x2000
然后,用该程序,生成一个.asm文件,命名为“实验5 中断地址列表”,然后进行编译和载入
三、设计键盘中断处理程序:
用于实现该程序把用户键入的回车(x0A)之前的字符打印10次(不带回写功能)
设计思路是为用户的输入开设一个50个存储单元的.BLKW进行对用户用键盘输入数据的存储,而具体存储输入的思路则是,为输入设计一个循环一输入数据为“回车”,作为跳出循环的判断。然后再设计两个相套的循环,来输出先前存储的数据,具体实现输出实现则是,外循环为输出次数计数,内循环实现对先前存储数据的顺序输出
注释:由于无法调用trap一类的输入、输出系统提供的程序,所以采用的方法是分别对KBSR和DSR进行轮询,在确认KBSR和DSR的bit[15]为1后,分别从KBDR 读取数据,和从DDR写入数据,从而实现对键盘输入数据的获取和将数据对显示器进行输出
代码如下:
.ORIG x2000
ST R0,ZHONGR0
ST R1,ZHONGR1
ST R2,ZHONGR2
ST R3,ZHONGR3
ST R4,ZHONGR4
ST R5,ZHONGR5 ;R5存储输入字符的个数
AND R5,R5,0
LEA R4,YOURS
CUNRU LDI R0, KBSR
BRzp CUNRU
LDI R0, KBDR
ADD R5,R5,1
STR R0,R4,0
ADD R4,R4,1
ADD R0,R0,-10
BRnp CUNRU
SHUCHU ST R5,CISHU ;R5计的数存入CISHU中
LEA R4,YOURS ;下列代码均是用于输出10次输入的字符
AND R3,R3,0
ADD R3,R3,10
XUNHUAN1 ADD R3,R3,-1 ;外循环计循环输出次数
BRn FINAL
LD R2,CISHU
ADD R5,R4,-1
XUNHUAN2 ADD R2,R2,-1
BRn XUNHUAN1
ADD R5,R5,1
LDR R0,R5,0
CHU LDI R1,DSR
BRzp CHU
STI R0, DDR
BRnzp XUNHUAN2
FINAL LD R0,ZHONGR0
LD R1,ZHONGR1
LD R2,ZHONGR2
LD R3,ZHONGR3
LD R4,ZHONGR4
LD R5,ZHONGR5
RTI
ZHONGR0 .FILL 0
ZHONGR1 .FILL 0
ZHONGR2 .FILL 0
ZHONGR3 .FILL 0
ZHONGR4 .FILL 0
ZHONGR5 .FILL 0
KBSR .FILL xFE00
KBDR .FILL xFE02
DSR .FILL xFE04
DDR .FILL xFE06
YOUS .BLKW 50 0
CISHU .FILL 0
四、实验结果如下:
文件生成:(具体实现代码的运行文件和联合代码可以从附件中获取)
运行结果和测试:
实验结论:
结合上述实验结果可以看出该实验的实验结果与我们预期达到的结果是符合的,所以可见我们设计的程序是成功的。
该实验对我们的要求较高,要求我们对中断有正确的认识,要求我们对LC-3如何进行中断然后返回运行主程序有很好的认识。除此之外,在中断程序上,由于无法使用trap指令来进行数据的输入和输出,所以要求我们必须对KBSR,KBDR,DDR,DSR这四个寄存器有正确的认识,不然无法达到对输入数据进行获取和输出。