计算机系统(一)期末复(yu)习(5):栈与中断

目录

  • 前言
  • 栈与LC-3中的栈
    • 压栈
    • 退栈
    • LC-3中栈操作
    • 溢出检测
  • 中断
    • PSR寄存器
    • 超级用户栈
    • 中断过程
      • 1.保存现场
      • 2.计算中断向量
      • 4.中断返回

前言

懒狗(指自己)复习完了(确信)。坐等挂科

好了不皮了。最后一章的内容是栈与中断。先介绍栈的机制及其实现,然后介绍通过栈来实现中断。

栈与LC-3中的栈

栈是先进后出的数据结构,学过数据结构这门课的,懂的都懂

压栈

使用栈顶指针top,top始终指向最新被压栈的元素。在进行一次压栈时,有:

  1. 栈指针top–
  2. 压入数据到top指向的内存

值得注意的是,栈指针的移动顺序是从高到低的,压栈,栈指针需要减小
计算机系统(一)期末复(yu)习(5):栈与中断_第1张图片

退栈

退栈和压栈操作相仿,也是移动栈指针来实现的。值得注意的是,退栈只改变栈指针,其实数据还是在栈中的。

将栈顶数据取出到 R0 ,有两个步骤:

  1. 取数据到R0
  2. 栈指针top++

计算机系统(一)期末复(yu)习(5):栈与中断_第2张图片

LC-3中栈操作

使用R0存取数据,使用R6表示栈指针。那么可以有如下的pop和push操作:

; Push
ADD	R6 R6 #-1
STR	R0 R6 #0
; Pop
LDR R0 R6 #0
ADD R6 R6 #1

溢出检测

压栈和退栈的过程中,要进行边界溢出检测,防止栈指针越界。

检测方法十分简单,在指针加减之前判断范围即可。下面给出压栈时,上溢出检测的代码:

	 LD  R1 MAX
	 ADD R6 R1 #0		; 如果top触顶则失败
	 BRz Fail 
	 ADD R6 R6 #-1
	 STR R0 R6 #0
	 AND R5 R5 #0		; 成功则R5=0
	 RET
Fail AND R5 R5 #0
	 ADD R5 R5 #1		; 失败则R5=1
	 RET
MAX  .FILL xC005		; -x3FFB

中断

这一章介绍中断及其驱动。通过硬件触发中断,然后通过栈来保存当前程序运行状态以嵌套中断。

在中断触发时,除了要保存PC和寄存器(寄存器由被调用者保存,不用操心),还要保存一些系统状态。这些状态被存储在PSR寄存器中。事实上,只用保存PC和PSR寄存器即可完成中断的响应以及嵌套。下面介绍PSR寄存器:

PSR寄存器

PSR寄存器即处理器状态寄存器,其15位是用户模式,10~8位是中断优先级,高优先级的中断响应可以打断低优先级的中断服务程序。2~0位则是nzp条件码。
计算机系统(一)期末复(yu)习(5):栈与中断_第3张图片

超级用户栈

超级用户栈供特权用户使用,和普通用户的栈空间分离。当中断发生时,用户模式由普通用户切换到超级用户。

超级用户栈指针存储在SAVE.SSP寄存器中。而普通用户栈指针存储在SAVE.USP中。值得注意的是,在LC-3中都是通过R6来访问栈指针的。

中断过程

中断分为四个过程:

  1. 保存现场,即保存中断发生时的系统状态,比如PC和PSR寄存器
  2. 计算中断向量:通过中断向量寻址找到中断服务程序起始位置
  3. 执行中断服务程序
  4. 从栈中还原中断发生前的现场

1.保存现场

保存现场分为如下几个步骤:

  1. 将普通用户栈指针R6存入SAVE.USP,然后从SAVE.SSP中取出超级用户栈指针
  2. 将PC和PSR压入超级用户栈
  3. 将PSR高位置0,设置中断优先级,将nzp清零

2.计算中断向量

将中断向量高位01拓展,即如果有中断向量x23,那么补齐之后有 x0123

然后去内存指定地址找到中断服务程序的起始地址,并且赋值给PC。(指针寻址)

4.中断返回

和RET不同,使用RTI指令以从中断中返回。

在这里插入图片描述
和RET不同的点在于,RTI主要做了两次退栈的操作,即弹出PC和PSR。

你可能感兴趣的:(计算机系统,lc-3,汇编)