CPU的结构
CPU的功能
控制器的功能
前面我们说过,CPU主要由运算器和控制器组成。
控制器的作用如下:
- 取指令
控制器必须具备能自动地从存储器中取出指令的功能。
第一条指令的地址可以人为指定,也可由系统设定。
- 分析指令
其一,分析此指令要完成什么操作,即控制器需发出什么操作命令;
其二,分析参与这次操作的操作数地址,即操作数的有效地址。
- 执行指令
根据分析指令产生的“操作命令”和“操作数地址”的要求,通过对运算器、存储器以及I/O设备的操作,执行每条指令。
- 指令控制
- 操作控制
- 时间控制
- 处理中断
-
CPU结构框图
CPU的完整组成如下:
分为: ALU:完成算术运算和逻辑运算
- 寄存器
- 地址寄存器: 用于存放当前指令的地址;
- 指令寄存器:用来存放当前指令和对指令的操作码进行译码;
- 中断系统:处理异常情况和特殊请求
- CU:能发出各种操作命令序列
运算器:由ALU为核心,加上寄存器构成 控制器:以CU为核心,加上寄存器构成
CPU的寄存器
通常CPU执行机器语言访问的寄存器为用户可见寄存器
用于控制CPU的操作或运算的寄存器被称为控制和状态寄存器
用户可见寄存器
用户寄存器分为一下几类:
通用寄存器:可用于存放操作数,也可作为满足某种寻址方式所需的寄存器。
基址寻址所需的基址寄存器、变址寻址所需的变址寄存器和堆栈寻址所需的栈指针,都可用通用寄存器代替。 寄存器间接寻址时还可用通用寄存器存放有效地址的地址。
数据寄存器:数据寄存器用于存放操作数。
两个数据寄存器拼接就可以存放双倍字长的数据。
地址寄存器:地址寄存器用于存放地址,也可用于特殊的寻址方式,如用于基址寻址的段指针(存放基地址)、用于变址寻址的变址寄存器和用于堆栈寻址的栈指针。
地址寄存器的位数必须足够长,以满足最大的地址范围。
条件代码寄存器:这类寄存器中存放条件码,它们对用户来说是部分透明的。
条件码是CPU根据运算结果由硬件设置的位(bits), 如算术运算会产生正、负、零或溢出等结果。条件码可被测试,作为分支运算的依据。此外,有些条件码也可被设置,如最高位进位标志C,可用指令对它置位和复位。将条件码放到一个或多个寄存器中,就构成了条件码寄存器。
控制和状态寄存器
- 控制寄存器
控制寄存器是用于控制CPU的操作,其中:
- MAR、MDR、IR三个寄存器用户不可见
- PC这三个寄存器用户可见
MAR:存储器地址寄存器,用于存放将被访问的存储单元的地址; MDR:存储器数据寄存器, 用于存放欲存入存储器中的数据或最近从存储器中读出的数据; PC:程序计数器,存放现行指令的地址,通常具有计数功能。当遇到转移类指令时,PC的值可被修改; IR:指令寄存器,存放当前欲执行的指令。
- 状态寄存器
- 状态寄存器:存放条件码
- PSW寄存器:存放程序状态字
举例
下面是不同CPU的详细组成:
看看就行。
控制单元CU和中断系统
控制单元CU是提供完成机器全部指令操作的微操作命令序列部件。
微操作是计算机中最小的操作单位。 举个例子:如果需要完成加法操作,那么其微操作如下:
- 获取被加数和加数的地址
- 根据地址寻址找到加数和被加数
- 把加数和被加数送到相应的寄存器
- 两数相加
- 结果送到目标寄存器当中
现代计算机中微操作命令序列的形成方法有两种:
- 一种是组合逻辑设计方法,为硬联线逻辑
- 另一种是微程序设计方法,为存储逻辑
这一部分会在第十章开始讲解
中断系统主要用于处理计算机的各种中断。
指令周期
指令周期的基本概念
指令周期
指令周期指的是取出并执行一条指令所需要的全部时间。
所以完成一条指令需要如下两个阶段:
- 取指周期:取指和分析
- 执行周期:执行指令
指令周期的不同
不同的指令,指令周期是不同的,原因如下:
- 不同的指令执行的操作不一样
- 不同的指令访存的次数不一样
如图:
无条件转移指令也被称作空操作指令,只有取指周期没有执行周期,这个前面讲过意义,这里不再赘述。
以加法指令和乘法指令为对比,乘法执行实际上执行的是加法操作和移位操作(详情见第六章),所以在执行的时候周期会比加法指令长。
具有间接寻址的指令周期
有间接寻址特征的指令,还有一个间址周期:
间址周期的作用是通过形式地址获得真实地址的时间。
带有中断周期的指令周期
指令周期流程
CPU工作周期的标志
在上面的讲述中我们知道,一条指令最多有4个周期,上述4个周期都有CPU访存操作, 只是访存的目的不同。为了区别它们,在CPU内可设置4个标志触发器,如下图所示:
FE
:取指IND
:间址EX
:执行INT
:中断
其中**1状态**
表示有效。它们分别由1→FE
、1→IND
、1→EX
和1→INT
4个信号控制。
取指阶段访存获得的是指令。 执行阶段访存获得的是操作数。
指令周期的数据流
取指令的数据流
① PC中存放现行指令的地址,该地址送到MAR
② MAR把该地址送至地址总线
③ 控制部件CU向存储器发出读命令
④ 对应MAR所指单元的内容(指令)经数据总线送至MDR
⑤ MDR把相应内容(指令)再送至IR
⑥ 与此同时CU控制PC内容加1,形成下一条指令的地址。
指令存放在存储器当中,所以需要一个读命令。
间址周期的数据流
一旦取指周期结束,CU便检查IR中的内容,以确定其是否有间址操作, 如果需间址操作:
① MDR中指示形式地址的右N位将被送至MAR
② MAR把改地址又送至地址总线
③ CU向存储器发读命令,并获取有效地址
④ 该有效地址存至MDR。
执行周期的数据流
由于不同的指令在执行周期的操作不同,因此执行周期的数据流是多种多样的, 可能涉及到CPU内部寄存器间的数据传送、或对存储器(或I/O)进行读写操作、或对ALU的操作,因此,无法用统一的数据流图表示。
中断周期的数据流
CPU进入中断周期要完成一系列操作, 其中PC当前的内容必须保存起来,以待执行完中断服务程序后可准确返回到该程序的间断处,这一操作的数据流如下图所示。
① CU把用于保存程序断点的存储器特殊地址(如堆栈指针的内容)送往MAR
② MAR将该地址并送到地址总线上,同时将PC的内容(程序断点)送到MDR
③ CU命令存储器写
④ MDR把程序断点经数据总线存入存储器
⑤ 将中断服务程序的入口地址送至PC,为下一个指令周期的取指周期作好准备
断点保护的内容有两个:
- 地址内容
- 数据内容
指令流水
如何提高机器的速度
提高访存速度
提高运算器速度
- 采用高速芯片
- 改进算法(加减乘除的算法,例如使用Booth算法)
-
提高整计处理能力
采用高速器件
- 改进系统结构
-
系统的并行性
并行的概念
首先要区分并行和并发:
并行
:两个或者两个以上的事件在同一时刻发生并发
:两个或者两个以上的事件在同一时间段发生
并行性的等级
取指令1 | 执行指令1 | 取指令2 | 执行指令2 | 取指令3 | 执行指令3 | …… |
---|---|---|---|---|---|---|
这里需要两个部件:
- 取指令:取指部件
- 执行指令:执行部件
所以在指令执行过程中,执行部件在工作,而取指部件就在等待执行部件。
二级指令
二级指令执行过程如下:
取指令1 | 执行指令1 | ||
---|---|---|---|
(流水建立时间) | 取指令2 | 执行指令2 | |
取指令3 | 执行指令3 |
简单的来说就是在执行指令的过程中,同时进行取指操作。
原本在四个时钟周期里面只能执行2个完整的指令,而现在却可以执行3个完整的指令。
理想情况下,二级指令的速度是串行指令的2倍。现实情况由于流水建立时间和其余特殊情况会导致速度低于2倍。
注意这里需要保证执行指令的时间和取指令的时间相同。
影响指令流水的因素
执行时间 > 取指时间
当执行时间>取指时间的时候,就会导致如下情况:
取指令1 | 执行指令1 | |||
---|---|---|---|---|
(流水建立时间) | 取指令2 | 执行指令2 |
也就是说取完指令2之后,由于指令1并没有执行完成,导致指令2的执行需要等待指令1执行完毕。
条件转移指令
条件转移指令使得必须等上条指令执行结束,才能确定下条指令的地址,造成时间损失。
结构问题
首先了解一个概念,也就是六级指令:
如图所示:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
指令1 | FI | DI | CO | FO | EI | WO | |||||
指令2 | FI | DI | CO | FO | EI | WO | |||||
指令3 | FI | DI | CO | FO | EI | WO | |||||
指令4 | FI | DI | CO | FO | EI | WO | |||||
指令5 | FI | DI | CO | FO | EI | WO | |||||
指令6 | (流水建立时间) | FI | DI | CO | FO | EI | WO |
也就是对指令的整个阶段做了更细粒度的划分:
**取指(FI)**
:从存储器取出一条指令并暂时存入指令部件的缓冲区。**指令译码(DI)**
:确定操作性质和操作数地址的形成方式。**计算操作数地址(CO)**
:计算操作数的有效地址,涉及到寄存器间址、间址、变址、基址、相对寻址等各种地址计算方式。**取操作数(FO)**
: 从存储器中取操作数(若操作数在寄存器中,则无需此阶段)。**执行指令(EI)**
:执行指令所需的操作,并将结果存于目的位置(寄存器中)。**写操作数(WO)**
:将结果存入存储器。
其中标红的部分是存在冲突的部分,例如在第4
个时钟周期里面,指令1的FO
操作需要访存,同时指令4的FI
操作也需要访存,这就会存在不同指令争用同一个功能部件产生的资源冲突。
同理第六个时钟周期也是一样的:WO访问数据也是要访存的。
所以解决的方案如下:
- 第4个指令取指的时候停顿一个时钟周期,等待第1个指令执行完毕
- 指令存储器和数据存储器分开存放(WO和FI或者FO就可以同时进行)
指令预取技术(预先取出所有指令,放入指令缓存器中,适合指令周期短的情况)
数据相关
(1)写后读相关(RAW)
也就是写操作会后于读操作,举个例子:SUB(减法操作):(R2) + (R3) -> (R**1**)
- ADD(加法操作):(R5) + (R**1**) -> (R4)
按照指令的执行顺序,应该是先执行SUB指令,把结果存入R1
寄存器当中,然后再执行ADD指令,计算得到的结果存入R4
当中。
但是由于指令流水的存在,会让**R****1**
还没有写入正确结果的时候,ADD指令直接把**R****1**
原本的值读取进行计算。这就是所谓的写后读。
(2)读后写相关(WAR)
也就是读操作会后于写操作,举个例子:
- STA(取数操作):(R2) -> M操作单元
- ADD(加法操作):(R4) + (R5) -> (R**2**)
按照指令的执行顺序,应该是先执行STA指令,把R2
寄存器当中的内容存入M当中,然后再执行ADD指令,计算得到的结果存入R2
当中。
但是由于STA取数操作需要进行地址译码,所以导致STA的整体指令周期大于ADD,**R****2**
的内容先被ADD指令写入,然后才被STA指令读取到M,也就是所谓的读后写。
(3)写后写相关(WAW)
也就是写操作会后于写操作,举个例子:
- MUL(乘法操作):(R2) (R1) -> (R**3*)
- ADD(加法操作):(R4) + (R5) -> (R**3**)
按照指令的执行顺序,应该是先执行MUL指令,把乘法的结果写入R3
寄存器当中,然后再执行ADD指令,计算得到的结果写入R3
当中。
但是由于MUL乘法操作其算法包含了加法和移位操作,所以导致MUL的整体指令周期大于ADD,ADD操作的结果先写入**R3**
,然后才是MUL操作的结果后写入**R3**
,也就是所谓的写后写。
以上三种情况的解决方案有:
- 后推法:也就是等待上一条指令执行完毕,再执行下一条
- 旁路技术:上一条指令计算的结果不直接写入寄存器,而是直接写入下一条指令所需要的地方。
控制相关
举个例子:
如图所示是一个简化之后的流程,其中CPX是一条条件转移指令,当一个数满足大于N的时候,执行后面的DIV指令,否则回去执行ADD指令。
由于指令采取的都是超前处理,所以需要在前一条指令没有执行完毕的时候,提前获取指令。但是在CPX指令没有执行完成的时候,不能预知下一条指令到底是什么,所以影响了流水线的性能。
如上图所示,指令3计算出来的结果可得需要转移指令,所以指令4-7都是无效指令。流水线性能
吞吐率
吞吐率指的是单位时间内流水线所完成指令或输出结果的数量,假设m段
流水线各时间段为△t
,那么:
最大吞吐率为:
实际吞吐率为:n越大的时候,Tp越接近Tmax。
以六指令流水为例:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
指令1 | FI | DI | CO | FO | EI | WO | |||||
m△t |
(n-1)△t |
||||||||||
指令2 | FI | DI | CO | FO | EI | WO | |||||
指令3 | FI | DI | CO | FO | EI | WO | |||||
指令4 | FI | DI | CO | FO | EI | WO | |||||
指令5 | FI | DI | CO | FO | EI | WO | |||||
指令6 | (流水建立时间) | FI | DI | CO | FO | EI | WO |
此时,m=6
,n=6
,所需时间为6△t+(6-1)△t = 11△t
,吞吐率就是其倒数。
加速比
加速比指的是**m**
段的流水线的速度与等功能的非流水线的速度之比。
还是以六指令流水为例:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
指令1 | FI | DI | CO | FO | EI | WO | |||||
m△t |
(n-1)△t |
||||||||||
指令2 | FI | DI | CO | FO | EI | WO | |||||
指令3 | FI | DI | CO | FO | EI | WO | |||||
指令4 | FI | DI | CO | FO | EI | WO | |||||
指令5 | FI | DI | CO | FO | EI | WO | |||||
指令6 | (流水建立时间) | FI | DI | CO | FO | EI | WO |
流水线时间为:6△t+(6-1)△t = 11△t
串行时间为:6*6△t = 36△t
那么加速比为:11/36
效率
效率指的是流水线中各功能段的利用率。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
指令1 | FI | DI | CO | FO | EI | WO | (流水排空时间) | ||||
指令2 | FI | DI | CO | FO | EI | WO | |||||
指令3 | FI | DI | CO | FO | EI | WO | |||||
指令4 | FI | DI | CO | FO | EI | WO | |||||
指令5 | FI | DI | CO | FO | EI | WO | |||||
指令6 | (流水建立时间) | FI | DI | CO | FO | EI | WO |
实际上效率就是指令时间区(灰色部分)在整个流水时间区(整个矩形)的面积比。
由上述六指令流水可知:
- 指令时间区:
6 * 6 * △t = 36△t
- 总时间区:
6*(6+6-1)△t = 66△t
流水线的多发技术
假设处理一条指令分四个阶段:取指(FI)、译码(ID)、执行(EX)和回写(WR)。
那么普通流水技术就是:
超标量技术
超标量技术就是配置多套指令处理部件,然后一次性送入多条可并行处理的指令进行处理,在每个时钟周期内可同时并发多条独立指令。
一次性处理n条指令称超标度为n。
超标量计算机不能重新安排指令内执行顺序,但可以通过编译优化技术,在高级语言翻译机器语言时,精心安排,把能并行执行的指令搭配起来,挖掘更多的指令并行性。
超流水线技术
超流水线技术是将一些流水线寄存器插入到流水线段中,好比将流水线再分道:
如上图所示。图中将原来的一个时钟周期又分成三段,使超级流水线的处理器周期比一般流水线的处理器周期短。在原来的时钟周期内,功能部件被使用三次,使流水线以3倍于原来时钟频率的速度运行。
与超标量计算机一样,硬件不能调整指令的执行顺序,靠编译程序解决优化问题。
超长指令字技术
超长指令字技术和超标量技术类似,如下图所示:
- 超标量技术是一次性送入多条可并行操作指令进行处理
- 超长指令字是把多条能并行操作的指令组合成一条具有多个操作码字段的超长指令
每一个操作码字段控制一个功能部件,相当于同时执行多条指令。
超标量技术较超标量具有更高的并行处理能力,但对优化编译器的要求更高,对Cache的容量要求更大。
中断系统
概述
引起中断的因素
能够引起系统中断的因素主要有以下几种:
- 人为设置的中断(例如转管指令)
- 程序性事故(例如操作数溢出,操作码不能识别,非法运算例如除数为0)
- 硬件故障
- I/O设备异常
- 外部事件
注意这里的转管指令,不是转移指令,转移指令之后程序是正常进行的,转管指令之后程序是中断的。
中断系统所需要解决的问题
首先需要了解一个概念:中断源,也就是所谓的发起中断请求的来源。
需要解决的问题如下:
- 各中断源如何向CPU提出请求
- 各中断源同时提出请求怎么办
- CPU什么条件、时间、方式响应中断
- 如何保护中断现场
- 如何寻找中断入口地址
- 如何恢复现场,如何返回
- 处理中断的过程中又出现了新的中断怎么办
中断请求标记和中断判优逻辑
中断请求标记
在计算机中,一个INTR中断请求标记触发器构成一个中断的请求源。多个INTR构成一个中断请求标记寄存器。
如图所示:
这些触发器分布有两种:
- 分散在各个中断源的接口电路当中
- 集中在CPU的中断系统内部
中断判优逻辑
由上图所示,多个触发器构成的中断寄存器,如果同时又多个中断请求发出,CPU就需要对这些请求进行判优处理,实现方式有两种:
(1)硬件实现
通过排队器进行实现。
一种方法是把各个中断源分散到各个中断源的接口电路当中,然后采用链式排队器进行判优处理。这个链式排队器会在第五章讲解,这里只需要了解一下即可
另一种方法就是集成在CPU,通过改变电路结构达到排队器的目的。
在上图中,通过电路分析可以得出:
- 当
INTR1
为高电平的时候,最终输出INTP1
就有效 - 而此时第一组元器件组中间路由了一根线到第二组的与门上,传送的信号经过非门变成了低电平
- 再经过第二组的与门导致第二组整体的输入变为了低电平,最终的输出也是低电平
- 其余元器件组的分析同理
所以可以得出,中断源发送请求的优先级为:**INTP****1 ****> INTP****2 ****> INTP****3 ****> INTP****4**
,也就是在链队前面的请求会被有限执行。
(2)软件实现
所谓软件实现,就是在代码层面实现程序的中断处理:
通过逻辑判断判断某一请求是否执行,比如A请求不执行的话就去看B请求是否执行。
中断服务程序入口地址的寻找
硬件向量法
首先需要知道几个概念:
- 中断向量:中断服务程序入口地址
- 中断向量地址:中断服务程序入口地址的地址
- 中断向量表:内存当中存放中断向量的一块区域
当程序产生中断的时候,会首先根据中断向量地址在中断向量表中查询到相应的中断向量,然后根据中断向量就可以找到中断服务程序的入口。
软件查询法
中断响应
响应中断的条件
计算中的中断有两个种类:
- 可屏蔽中断
- 非屏蔽中断(例如电源掉电)
CPU面对中断也有两个状态:
- 开中断状态
- 关中断状态
判断CPU处于哪一种状态的依据就是允许中断触发器EINT的状态,如果EINT = 1
说明处于开中断状态,反之则为关中断状态。
而EINT只能影响可屏蔽中断,非屏蔽中断无论CPU处于何种状态都需要做出响应。
响应中断的时间
指令执行周期结束时刻由CPU发查询信号,这一段时间就是响应中断的时间。其结构图如下:
CPU中断查询是一个脉冲信号,指令执行周期结束之后就会发送一个有效电平,所有中断源的请求都会被发送到排队器当中。
中断隐指令
响应中断的步骤如下:
- 保护程序断点
- 断点存放于特定地址(0号地址)
- 断点存入堆栈当中
- 寻找服务程序入口地址
- 硬件向量法
- 软件查询法
- 硬件关闭中断
关中断状态下,其余中断发送的请求都是无效请求,不会被处理。
保护现场和恢复现场
保护的内容
断点保护的内容有:
- 断点保护
- 主要是保护断点的地址
- 通过隐指令完成(也就是硬件完成)
寄存器内容保护
采用PUSH指令保护现场
- 排队器决定启用那个请求源
- 采用POP指令恢复现场
- IRET指令返回中断
恢复现场的顺序和保护现场的数据是恰巧相反的。
中断屏蔽技术
多重中断的概念
首先,如果在地址为**k**
的地方发送了中断,在中断返回之后,返回的地址应该是**k+1**
。
多重中断就是在中断的过程中又发生了其他的中断,又叫嵌套中断,例如在这张图中:
中断点有三个:k
,l
,m
,返回中断点也有三个:k+1
,l+1
,m+1
。
实现多重中断的条件
多重中断需要满足两个条件:
- 提前设置开中断指令
- 优先级别高的中断可以中断优先级别低的中断
举个例子:
由图可得,主程序中一共发送了三次中断请求:
- 第一次:同时发送中断请求B和C
- 第二次:发送中断请求D
- 第三次:发送中断请求A
且中断的优先级是A>B>C>D
。
- 首先看第一次的请求,由于B的优先级高于C的优先级,所以优先去B的程序区域处理B中断。
- 处理完毕之后,返回主程序,此时排队器之后到了C请求,于是前往C程序区域处理C中断请求
- 接下来返回主程序,接受到了D的请求
- 在处理D请求的时候,又出现了A中断请求,由于A的优先级高于D,所以从D的程序区域前往A的程序区域优先处理A请求
- A区域处理完请求之后返回D区域继续处理D请求
- 最后D请求处理完,返回主程序
屏蔽技术
(1)屏蔽触发器的作用
屏蔽触发器的作用就是使得某一中断请求触发器的请求失效:
如上图所示,当**MASK = 0**
的时候,此时中断请求触发器未被屏蔽,反之则被屏蔽,也就是发出的信号都是无效信号。这就可以用在前面的排队器上面:
当MASK=1
的时候,INTP恒为0,也就是不能被排队器选中,这就改变了原本排队器的顺序。
(2)屏蔽字
前面见过,多位中断屏蔽触发器构成一个中断屏蔽寄存器,寄存器当中的每一位的状态就代表了每一位中断屏蔽触发器的状态,中断屏蔽寄存器当中的内容就被成为屏蔽字。屏蔽字反映了中断请求处理的优先级。
假设有16分中断屏蔽触发器:
中断请求就有16
个,他们的优先级对应的就是1-16
,在这里1
的优先级最高,没有任何中断请求可以中断**中断请求1**
。
那如果是对于中断请求2
,就只有中断请求1
可以中断。后面以此类推。
(3)屏蔽技术可以改变处理优先级
中断请求的优先级分为两类:
- 响应优先级:由硬件决定,不可改变
- 处理优先级:可以通过设置新的屏蔽字改变
比如:
中断源 | 原屏蔽字 | 新屏蔽字 |
---|---|---|
A | 1 1 1 1 | 1 1 1 1 |
B | 0 1 1 1 | 0 1 0 0 |
C | 0 0 1 1 | 0 1 1 0 |
D | 0 0 0 1 | 0 1 1 1 |
响应优先级:A > B > C > D
处理优先级:A > D > C > B
简单来看就是谁
1
越多,优先级越高。
接下来看一个例子理解一下响应优先级和处理优先级的区别。
:::info
下面的例子是同时发出ABCD四种中断请求,其优先级别如上。
:::
首先来看没有设置新屏蔽字的情况下,程序处理中断请求的过程:
很简单,就是根据优先级别响应和处理。
接下来看设置新屏蔽字的情况下,程序处理中断请求的过程:
步骤如下:
- 首先还是先响应A程序,同时A程序的处理级别也最高,所以最先处理完
- 接下来因为B的响应级别最高,所以响应B程序,由于B程序的处理请求低于C和D,又由于C的响应级别高于D,所以在B程序没有处理完毕的时候,响应了C程序。
- 理由同上,在C程序没处理完的时候,由于D程序的处理级别高于C,所以又去响应了D程序。
- 此时D程序处理完毕,再返回处理C程序,最后返回处理B程序。
从上面的步骤我们就可以看出:
- 响应优先级:A > B > C > D
- 处理优先级:A > D > C > B
(4)屏蔽技术的其他作用
可以人为地屏蔽某个中断源的请求,便于程序控制。
(5)新屏蔽字的设计
在有设置新屏蔽字的情况下,中断处理的步骤如下:
- 断点存入堆栈
- 断点存入“0”地址
第一种方式没有问题,第二种方式在多重中断的时候,后面的断点内容会覆盖前面的断点内容,解决方式就是在做下一次的断点保护前,先把前一次的断点保护的内容转存到ACC当中。