【计算机系统】LC-3中断试验

Alex_Shen
2021-05-17 / 0 评论 / 0 点赞 / 188 阅读 / 3,724 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

代码: Github仓库地址

中断实验

计算机领域中,中断就是由软硬件向处理器发送信号,处理器收到并立即处理该信号表示事件的过程。中断会暂停当前处理器正在执行的流程,然后将处理器切换到高优先级。处理器会暂存当前任务的状态,然后执行一小段称为中断处理程序(ISR)的代码来处理该事件。中断是暂时的,中断处理程序执行结束后,处理器会回到之前任务暂存的状态继续执行,中断分为两种类型:硬件中断和软件中断。

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

实验分为三部分:

一、用户程序:该程序持续间隔的输出两行不同的“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    

为了不让屏幕太快的输出以至于看不清每行的内容,该程序需要嵌入一段计数代码,每次从2500递减到0,计数完成,然后输出一行,下面为一个简单的DELAY子程序供参考:

DELAY   ST  R1, SaveR1
        LD  R1, COUNT
REP     ADD R1,R1,#-1
        BRp REP
        LD  R1, SaveR1
        RET
COUNT   .FILL #2500
SaveR1  .BLKW 1

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

三、操作系统使能代码:很不幸的是,LC-3上还不能安装WindowsLinux ,所以如下工作需要在用户程序中首先完成:

  1. 通常情况下,当遇到中断发生之前,操作系统已经开辟好栈空间,保存PCPSR,当执行到RTI时,PCPSR会被弹栈,因为没有操作系统,需要初始化R6X3000,指示一个空栈。
  2. 同样,操作系统会建立一张中断向量表,用来包含中断处理程序对应的起始执行地址,因此,本实验的键盘中断处理程序需要你来做,中断向量表的起始地址为X0100,键盘中断处理程序的起始地址为X80,本实验只需要提供该中断处理程序的地址即可。
  3. 最后,操作系统会把KBSRIE(Interrupt Enable)位置1,所以你也需要这样做。

下面为用户程序模板:

ORIG    x3000
--      ---     ; initialize the stack pointer
   ...
--      ---
--      ---     ; set up the keyboard interrupt vector table entry
   ...
--      ---
--      ---     ; enable keyboard interrupts
   ...
--      ---     
--      ---     ; start of actual user program to print ICS checkerboard
   ...
  --      ---
.END

中断处理程序模板:

.ORIG     x2000
--     ---      ; the code
  ...
--     ---
RTI
--     ---      ; buffer space as required
  ...
--     ---
.END

注意:LC-3仿真器只有windows版本支持中断,linux暂不支持,所以本实验需要在windows下面完成。其他参考进教材第八章第五节、第十章和附录A。

实验目的

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

实验内容

实验分为三部分:

一、用户程序:该程序持续间隔的输出两行不同的“ICS”,为了不让屏幕太快的输出以至于看不清每行的内容,该程序需要嵌入一段计数代码,每次从2500递减到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,所以你也需要这样做。

实验步骤

一:用户程序

该程序持续间隔的输出两行不同的“ICS”,为了不让屏幕太快的输出以至于看不清每行的内容,该程序需要嵌入一段计数代码,每次从2500递减到0,计数完成,然后输出一行。

			.ORIG	x3000
			LD	R6,STACK		; initialize the stack pointer
			LD	R1,ENTRY1		; set up the keyboard interrupt vector table entry
			LD	R2,STARTS;
			STR	R2,R1,#0;
			LD	R3,IE			; enable keyboard interrupts
			STI	R3,KBSR; 
								;start of actual user program to print ICS checkerboard
AGAIN		LEA	R0,STR1;
			PUTS;
			JSR	DELAY;
			LEA	R0,STR2;
			PUTS;
			JSR	DELAY;
			BR	AGAIN;
			HALT;
		
ENTRY1		.FILL		X0180
STARTS		.FILL		X2000
STACK		.FILL		X3000
IE			.FILL		X4000
KBSR		.FILL		XFE00
STR1		.STRINGZ	"ICS ICS ICS ICS ICS ICS \n"
STR2		.STRINGZ	"  ICS 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		 #2500
SaveR1  	.BLKW		 1

.END

二:中断程序

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

		.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
		ADD	R6,R6,#-1
		STR		R4,R6,#0

		LD		R4,STRING		;IE:字符串首地址
LOOP1	LDI		R1,KBSR		;检查键盘状态
		BRZP	LOOP1
		LDI		R0,KBDR
		LD		R2,BREAK		;判断是否为回车
		ADD	R2,R2,R0
		BRZ		LOOP			;是则结束输入
		STR		R0,R4,#0			;不是则存入字符串
		ADD	R4,R4,#1
		BRNZP	LOOP1
		LOOP	AND	R0,R0,#0		;在字符串最后存入回车作为结束标识
		ADD	R0,R0,#10
		STR		R0,R4,#0
NEXT1	AND	R3,R3,#0
		ADD	R3,R3,#10			;R3:计数器,循环十次
LOOP3	LD		R4,STRING
LOOP5	LDR	R0,R4,#0				;读取字符串
		ADD	R4,R4,#1
LOOP4	LDI		R1,DSR				;检查显示器状态
		BRZP	LOOP4
		LD		R2,BREAK			;判断是否为回车
		ADD	R2,R2,R0
		BRZ		NEXT3				;是则进行下一次循环
		STI		R0,DDR				;不是则输出字符
		BRNZP	LOOP5
NEXT3	ADD	R3,R3,#-1
		BRP		LOOP3
NEXT2	LDR	R4,R6,#0				;从栈中取回数据

		ADD	R6,R6,#1
		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							;回到用户程序

KBSR	.FILL	xFE00
KBDR	.FILL	xFE02
DSR		.FILL	xFE04
DDR		.FILL	xFE06
BREAK	.FILL	xFFF6				;-x000A
STRING	.FILL	x4000				;字符串首地址
.END

三:实验结果验证

同时打开用户程序.obj与中断程序.obj
在这里插入图片描述在这里插入图片描述

再根据要求在程序输出时键入字符并回车。
在这里插入图片描述
实验结果正确。

0

评论区