LC-3中断实验

news2024/11/26 7:40:11

一、实验目的

  1. 学会分析和理解给定的编程问题;
  2. 掌握中断驱动的基本原理;
  3. 掌握键盘数据寄存器(KBDR)及键盘状态寄存器(KBSR)工作基本原理;
  4. 掌握输出数据寄存器(DDR)及输出状态寄存器(DSR)工作基本原理;
  5. 利用LC-3设计并编写用户程序及中断程序。

二、实验内容

1.实验背景

在计算机科学中,一个中断就是有硬件和软件发起的一个事件,表明需要立即处理。
高优先级的条件下一个中断通知处理器需要中断正在运行的程序,处理器挂起正在处理的行为,保存执行程序的状态,然后执行一个小的中断处理程序(中断服务程序)来处理事件。
中断是临时的,当处理器执行完中断处理程序后,处理器继续执行之前被中断的程序,中断分硬件中断和软件中断。

2.实验描述

表明中断驱动的输入、输出可以中断一个正在运行的程序,执行中断服务程序,返回被中断的程序,从被中断位置下一个地址继续执行(好像什么也没发生似的)。实验中使用键盘作为输入设备,中断正在运行的程序。

3.实验任务

包括以下三部分:

A.用户程序

用户程序将会包含连续地输出纵横交替的ICS,通过交替输出两个不同行,如下:
在这里插入图片描述
确保输出不至于太快,以至于肉眼不能察觉。用户程序应该包含以小段代码用于每行间的计数,间隔为从25000开始倒计时输出在屏幕上。

B.键盘中断服务程序

键盘中断服务程序将会简单地在屏幕上写上十次,用户随机输入的字符并以Enter(x0A)结束。
中断服务程序中不能使用TRAP指令。如在屏幕上显示一个字符,必须检测先DSR寄存器,然后写进DDR寄存器,并且也不可以调用 TRAP x21(OUT),或者其它TRAP程序。

C.操作系统支持的代码

LC-3上没有安装windows或Linux,所以必须要求在用户程序代码前先做到以下三个步骤。

  1. 正常情况下,操作系统将会先安装一些栈空间,所以当中断发生的时候PCPSR可以被放进栈中(当程序执行RTIPCPSR都会被弹出栈,处理器返回到执行被中断的程序)由于没有操作系统,请先把R6初始化为x3000,表示一个空的栈。
  2. 正常情况下,操作系统会建立中断向量表,它包含对应中断服务程序的起始地址,你必须为键盘中断先建立一个中断向量表。中断向量表的开始地址是x0100,键盘中断的中断向量是x80。你必须在中断向量表提供一个入口供本实验使用。
  3. 操作系统应该设置KBSR的IE(Interrupt Enable)位,这个也由你实现。

三、实验步骤与结果

程序实现思路及流程图

1.用户程序思路和流程图

要实现从键盘输入一个字符后执行中断程序,就需要将中断程序的起始地址写入键盘的中断矢量表中,且要将KBSR的中断使能位设置为1。具体步骤如下(Fig. 1):
首先要进行预处理:

  1. R6初始化为x3000,表示一个空栈,用于存放PCPSR等需要保存和恢复的内容。
  2. 将中断服务程序的入口地址x2000和键盘的中断矢量x0180联系起来。
  3. KBSR的中断使能位设置为1

然后,依次完成以下三个步骤:

  1. 在用户程序中,连续地输出纵横交替的ICS
  2. 在读入来自键盘的字符后,保护现场并进入中断服务子程序
  3. 在子程序中,如果键入回车,则输出十个之前键入的字符,恢复现场,并回到用户程序,重复3。

在这里插入图片描述
Figure 1用户程序的流程图

2.中断服务子程序的思路和流程图

该程序分为以下几个步骤(Fig. 2):

  1. 压栈保存寄存器(保护现场)
  2. 反复检测KBSR[15],如果KBSR[15]=1,则检测键入的字符是否是回车。如果是回车,则执行3;如果不是回车,则更新待输出的字符后回到2。
  3. 连续输出十个之前在用户程序键入的字符并换行。
  4. 退栈以恢复寄存器(恢复现场)并执行RTI
    在这里插入图片描述

实验结果

实验结果如下:

  1. 无键盘读入时,交替输出“ICS”;从键盘读入一个字符‘5’后暂停(Fig. 3)。
    在这里插入图片描述
    Figure 3 读入字符‘5’以后,键入回车以前的情景

  2. 键入回车,连续输出10个‘5’以后又回到最初的样子:交替输出“ICS”(Fig. 4)。
    在这里插入图片描述
    Figure 4键入回车以后的情景

四、完整代码

lab5_user_program

; author: CAO-Wuhui
; date: 2021.6.19
; This is the program of user

		.ORIG    x3000
		LD	R6,STACK		; initialize the stack pointer saved in R6

							; set up the keyboard interrupt vector table entry
		LD	R1,ENTRANCE		; Interrupt Vector
		LD	R2,INTV			; The entrance of the interrupt service routine
		STR	R1,R2,#0		; If there is something input from keyboard, PC will go to x2000

							; enable keyboard interrupts
		LD	R3,IE				
		STI	R3,KBSR			; KBSR[14] = 1		

							; Start of actual user program to print ICS checkerboard
PRINT	LEA	R0,STR1			
		TRAP	x22			; Print the first string
		LEA	R0,STR2	
		JSR	DELAY
		TRAP	x22			; Print the second string
		JSR	DELAY
		BRnzp	PRINT		; Continue printing
		HALT

DELAY   ST  R1, SaveR1		
        LD  R1, COUNT
REP     ADD R1,R1,#-1
        BRp REP
        LD  R1, SaveR1
        RET

STR1	.STRINGZ	"ICS     ICS     ICS     ICS     ICS     ICS\n"
STR2	.STRINGZ	"    ICS     ICS     ICS     ICS     ICS\n"
IE		.FILL	x4000		;0100 0000 0000 0000
KBSR	.FILL	xFE00		
KBDR	.FILL	xFE02
COUNT   .FILL #25000
INTV	.FILL	x0180
ENTRANCE	.FILL	x2000
SaveR1  .FILL #0
STACK	.FILL	x3000
.END

lab5_interrupt_service_routine.asm

        .ORIG     x2000 ; the code
    
        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

LOOP    ST  R0,SaveR0
CHECK   LDI R1,KBSR     ; Check the value of KBSR[15] 
        ADD R1,R1,#0    ; If KBSR[15] = 1, break
        BRzp    CHECK   ; 
        LDI R0,KBDR
        LD  R2,_ENDLINE ;
        ADD R2,R2,R0
        BRnp    LOOP
        AND R3,R3,#0
        ADD R3,R3,#10

P_LOOP  LD  R0,SaveR0
START   LDI R1,DSR      ; Check the value of DSR[15]
        BRzp    START   ; If DSR[15] = 1, break
        STI R0,DDR       
        ADD R3,R3,#-1
        BRp P_LOOP

P_ENDL  LD  R0,ENDLINE
        LDI R1,DSR
        BRzp    P_ENDL
        STI R0,DDR

        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

                          ; buffer space as required
_ENDLINE .FILL   xFFF6  ; _'\n'
ENDLINE .FILL   x000A   ; '\n'
SaveR0  .FILL   #0
KBSR    .FILL   xFE00
KBDR    .FILL   xFE02
DSR     .FILL   xFE04
DDR     .FILL   xFE06

        .END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/566058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Splunk安装配置

前言 Splunk 社区 ,包括白皮书,各类手册,资源下载,社区问答等 入门:Splunk 入门指南 | Splunk 手册:Splunk Enterprise - Splunk Documentation 资源下载:数据可视化工具Splunk Enterprise免费下载 | S…

chatgpt赋能python:Python对Word文档的支持——打造高效办公新选择

Python对Word文档的支持——打造高效办公新选择 在现代社会,文档处理和管理已成为各行各业不可或缺的一部分。在这个领域中,Word文档一直占据主导地位,成为了几乎所有企业和机构必备的工具。而Python作为一门众所周知的高效编程语言&#xf…

雅思口语话题准备(一)

目录 where are you from? 3.Will you live in the countryside in the future? 4.Have you learned the history of your hometown at school? Does your name have any particular(or special)meaning? 作为一个英语音标大师,请问ɒ和ɔ他们之间有…

chatgpt赋能python:Python%(.2f)怎么用?从入门到进阶

Python%(.2f)怎么用?从入门到进阶 Python作为一种高效的编程语言,拥有广泛的应用领域,尤其在AI、数据分析、Web开发以及自动化运维等方面得到了广泛的应用,成为当下最受欢迎的编程语言之一。在这篇SEO文章中,我们将介…

5月25日第壹简报,星期四,农历四月初七

5月25日第壹简报,星期四,农历四月初七坚持阅读,静待花开1. 教育部:2023年为中西部乡镇卫生院培养订单定向免费五年制本科医学生共计6150人。2. 全球第一个集成人工智能功能的PC系统诞生!微软宣布将在6月推出Windows Co…

c++ ffmpeg 浅谈YUV444、YUV422、YUV420(2)

本期将会给大家介绍YUV相关基础知识,同时也介绍威创网络分布式系统的卓越色彩处理技术。 1.什么是YUV色彩空间 2.YUV采样格式 3.YUV不同采样格式对图像画质的影响分析 一、什么是YUV色彩空间? YUV是视频、图片、相机等应用中常常使用的一类图像格式,是…

达美乐面试(部分)(未完全解析)

Java如何保证非线程安全的数据结构(比如HashMap)的原子性?读多写少时用哪种锁好? A: 方法1:CAS等乐观锁机制,方法2:如果读多写少,可以使用读写锁(ReentrantReadWriteLock&#xff0…

【MySQL 数据库】3、多表查询

目录 一、多表关系二、多表查询三、内连接四、外连接五、自连接六、联合查询七、什么是子查询八、标量子查询九、列子查询十、行子查询十一、表子查询十二、多表查询练习题 一、多表关系 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块…

移动端H5页面PDF操作及预览

环境:nodejs 适配:移动端主流浏览器支持企业微信低版本 插件:pdfjs-dist 2.6.347 方案一 本地构建 拉取项目: git clone https://github.com/mozilla/pdfjs-dist.git 全局安装gulp npm install -g gulp-cli 安装项目依赖 np…

chatgpt赋能python:Python中的s.len()方法介绍

Python中的s.len()方法介绍 Python中有各种字符串处理方法,其中s.len()方法是一个重要的方法之一。s.len()返回一个字符串s的长度。这是一个非常基本的方法,但是在很多情况下都会被使用。本文将介绍Python中s.len()方法的一些用法和注意事项。 s.len()…

Redis持久化及集群

Redis可以通过将数据保存在磁盘里实现持久化功能, 以防止宕机导致的数据大量丢失.但是持久化只能保证在磁盘不损坏的情况下, 长时间保存数据, 如果一旦磁盘损坏, 数据仍然会丢失. 为了解决这个问题, 主从复制应允而生. 主从复制是Redis集群中的一总, 其中一个Redis做主, 其他R…

C++数据结构:线性顺序表(数组)

文章目录 前言一、vector简介二、泛型编程自定义数组结构1、定义类2、删除、读取元素和首尾指针3、修改元素、获取元素数量、和插入 总结 前言 将一个线性表存储到计算机中,把线性表的结点按逻辑顺序依次存放到一组地址连续的存储单元里,用这种方法存储…

nodejs+vue+elementui个人心情日志博客网站系统5ht83

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端vueelementui,博客管理系统模块 该模块是博客管理系统中的重要模块,它也是博客管理系统的主模块,该模块的…

从 WebKit 看浏览器内核架构

浏览器常见的浏览器内核有:Blink、WebKit、Gecko、Trident 等,目前 WebKit 内核占据了非常大的的市场,包括 Chrome、Safari、安卓浏览器等市面上的主流浏览器,都使用了 WebKit 内核。 从 WebKit 看浏览器内核架构 既然 WebKit 这么…

lwip的arp协议的意义和更新时机

ARP协议存在的目的 ARP(Address Resolution Protocol)协议是 TCP/IP 协议族中的一个协议,它的主要目的是将 IP 地址解析为 MAC(Media Access Control)地址,以便在局域网中进行通信。 具体而言&#xff0c…

## 如何顺序处理设备上报的数据

1. 引言 随着智能技术的发展,市场上出现了很多的智能设备,其具有连接网络的能力。用户可以实现远程控制,并且设备也可上报自己的状态,实现云端对设备的运行情况分析。在某些情况下需要保证设备上报状态的有序性,例如传…

Unity之ShaderGraph 节点介绍 Input输入节点

目录 Input(输入)  1、Basic(基本)   1) Boolean(布尔)   2) Color(颜色)   3) Constant(常量)   4) Integer(整型)   5)…

weblogic CVE-2023-21839 复现

影响版本 Weblogic 12.2.1.3.0 Weblogic 12.2.1.4.0 Weblogic 14.1.1.0.0 这里是用的docker下载的vulhub的CVE-2023-21839 靶机和攻击机都是192.168.85.131 docker 启动环境 ocker-compose up -d 然后看一下说明书 vim README.zh-cn.md 让你访问ip:7001/console 好&a…

chatgpt赋能python:PythonWoody:网站优化工具的首选

Python Woody: 网站优化工具的首选 在当今数字化时代,网站被认为是企业的门面。 然而,这只是建立网络存在的起点。 在许多情况下,优化网站并提高其排名对于企业的成功至关重要。 在这里,Python Woody成为了网站优化工具的首选。 …