LC-3 中断实验

计算机系统 实验5

实验目的:

展示如何让输入输出通过执行中断处理程序的方式来暂停和恢复一个正在运行的程序,恢复后的程序就像中间什么都没有发生过,本实验使用键盘作为输入来中断正在运行的程序。

实验内容与实验要求:

设计实验程序分为三部分:

  • 用户程序:

该程序持续间隔的输出两行不同的“ICS”——为了不让屏幕太快的输出以至于看不清每行的内容,该程序需要嵌入一段计数代码,每次从2500递减到0,计数完成,然后输出一行(但实际过程中发现,从2500递减到0,还是会输出太快,所以我用户程序在设计时调用了5次,该子程序,并且子程序是从10000递减到0的)

  • 键盘中断处理程序:

该程序每次简单的把用户键入的回车(x0A)之前的字符打印10次。在中断处理程序中,TRAP指令是不能使用的,当需要显示字符时,必须通过读写DSR的方式,也不能用TRAP x21(OUT)和其他的TRAP指令。在中断处理程序中要对用到的寄存器的状态暂存和恢复。

  • 操作系统使能代码:

很不幸的是,LC-3上还不能安装Windows Linux ,所以如下工作需要在用户程序中首先完成:

1、通常情况下,当遇到中断发生之前,操作系统已经开辟好栈空间,保存PCPSR,当执行到RTI时,PCPSR会被弹栈,因为没有操作系统,需要初始化R6X3000,指示一个空栈。

2、同样,操作系统会建立一张中断向量表,用来包含中断处理程序对应的起始执行地址,因此,本实验的键盘中断处理程序需要你来做,中断向量表的起始地址为X0100,键盘中断处理程序的起始地址为X80,本实验只需要提供该中断处理程序的地址即可。

3、最后,操作系统会把KBSRIE(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”

代码如下:

.ORIG   x3000

          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        ; KBSRIE(Interrupt Enable) 位置1

LD   R6,KONGZHAN

          AND  R1,R1,0

          ADD  R1,R1,1

          AND  R2,R2,0

ZHUXUN   JSR  DELAY                ;为了提高可见度,调用了5DELAY

          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这四个寄存器有正确的认识,不然无法达到对输入数据进行获取和输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值