从零构建:在模拟环境中亲手实现一个可工作的中断系统
记得我刚开始学计算机组成原理那会儿,课本上那些关于中断的流程图和时序图看得人头大。什么“保存现场”、“恢复现场”、“中断向量表”,每个字都认识,连起来却像天书。直到后来在实验室里,亲手在模拟器上拨动开关、设置寄存器、看着程序因为一个按钮而“跳”到另一段代码执行,那一刻才真正明白了中断到底是怎么一回事——它不是抽象的概念,而是一套精巧的、由硬件和软件共同编织的协作协议。
今天,我们就抛开枯燥的理论,直接动手。我会带你使用一个经典的计算机系统模拟程序(你可以把它想象成一个虚拟的、极其简化的CPU和内存),从最基础的电路连线开始,一步步搭建起一个能响应外部事件、暂停手头工作、处理完紧急任务再回来的完整中断系统。这个过程,就像在数字世界里搭建一座有应急通道的大楼,你会亲手设置每一块“砖”(寄存器),铺设每一条“线路”(总线),并编写控制“保安”(中断控制器)行为的规则。无论你是正在啃硬骨头的大学生,还是对计算机底层运行机制充满好奇的开发者,这篇指南都将为你提供一条从理论通往实践的清晰路径。
1. 实验环境准备与核心概念重塑
在开始连线之前,我们得先统一“语言”。本实验基于一个教学用的计算机硬件模拟系统。它虽然简化,但五脏俱全:包含一个简单的8位CPU、256字节的内存、若干通用寄存器(R0, R1, R2...)、一个程序计数器(PC)、以及我们本次实验的主角——中断控制器。
为了让你不是机械地跟着步骤做,而是理解每一步背后的意图,我们先快速厘清几个会在后续操作中反复出现的核心角色:
- 中断请求(INTR):你可以把它想象成大楼里的火警按钮。当外部设备(比如模拟器上的一个物理按钮)需要CPU立即关注时,就按下它,发出一个高电平脉冲信号。
- 中断屏蔽:不是所有“火警”都需要立刻处理。CPU可以通过设置一个特殊的开关(中断允许触发器
IEF)来决定是否响应中断。IEF=1表示“开门迎客”,IEF=0则表示“免打扰模式”。 - 中断向量:火警响了,保安(CPU)应该跑去哪里执行灭火程序?这个地址就是中断向量。在我们的模拟器中,它通常是一个固定的内存地址(例如
0x0A0),CPU一响应中断,就会自动跳转到这个地址开始执行。 - 断点保护:保安跑去灭火前,必须记住手头工作做到哪了(当前程序计数器PC的值),以及手里正拿着什么工具(关键寄存器的值)。把这些信息存到安全的地方(通常是栈内存,本模拟器用特定寄存器保存),就叫保存现场。
- 中断服务程序(ISR):就是那段“灭火”的代码。它执行具体的处理任务,比如读取设备数据、进行紧急计算等。最后,它必须执行一条中断返回指令,把保安“送”回原来的工作岗位,并恢复之前的工作状态。
我们的模拟器通过一系列拨码开关(SW7-SW0)来输入地址和数据,通过按钮(QD, CLR#)来执行命令,并通过指示灯观察内部状态。理解了这个交互模型,后面的操作就不再是盲目的数字输入,而是一场与机器对话的过程。
提示:在开始实验前,请确保你已获取并打开了指定的计算机组成原理模拟软件。不同学校的实验平台可能界面略有差异,但核心逻辑和操作流程是相通的。
2. 搭建舞台:初始化系统与程序“烧录”
现在,让我们启动模拟器,并着手准备两个关键部分:一是为主程序和服务程序分配内存空间并存入机器码;二是正确设置好相关的寄存器,为中断的发生铺平道路。
2.1 系统复位与工作模式选择
任何精密操作开始前,都需要一个确定的初始状态。
- 系统复位:找到并按下
CLR#按钮(通常是清零或复位键)。这个操作会将程序计数器(PC)、地址寄存器(AR)、指令寄存器(IR)等关键部件清零,确保系统从一个绝对干净的状态开始。你应该能看到相关指示灯全部归零。 - 设置连续运行模式:找到控制运行模式的三个开关:
DP(单拍)、DB(单步)、DZ(单指)。将它们全部拨到0。这表示系统将处于“连续运行”模式,除非遇到中断或我们手动干预,否则程序会一条接一条地执行下去。 - 选择寄存器加载模式:找到
SWB和SWA这两个模式选择开关。将它们设置为SWB=1,SWA=1。这个组合通常对应KLD模式,即“寄存器加载”工作方式。在此模式下,我们可以通过开关向指定的通用寄存器(如R1, R2)写入数据。
完成以上步骤后,你的模拟器就处于“准备接受寄存器配置”的状态了。
2.2 配置关键寄存器:R1与R2的角色
在我们的实验设计中,寄存器R1和R2被赋予了特定的使命,它们就像是中断剧本里的两个关键配角。
- R1 的作用:在主程序中,我们有一条指令
JMP [R1]。这条指令的含义是“跳转到R1寄存器所保存的地址指向的内存单元中的地址去执行”。这听起来有点绕,实际上它是一种间接跳转。我们需要事先在R1中存入一个地址,比如0x21,那么在执行到JMP [R1]时,CPU会去内存的0x21单元取出里面的值(这个值是我们预先存好的另一个地址),然后跳转到那个地址。这里我们先把它设为中断返回后主程序的延续地址。 - R2 的作用:主程序有一条
LDA R0, [R2]指令,意为“将R2寄存器中的值作为地址,从该地址指向的内存单元中加载数据到R0”。所以R2里存放的是一个数据的地址。
让我们来设置它们。以下操作均在 KLD 模式下进行:

&spm=1001.2101.3001.5002&articleId=151278622&d=1&t=3&u=d3ace0ea1158400c8412ab2a12d744a4)
1082

被折叠的 条评论
为什么被折叠?



