指令流程和中断
一、指令系统
1、什么是指令
指令是指能让计算机完成某种操作的命令。
2、什么是指令系统
指令系统是指一台计算机所能执行的全部指令。
3、指令格式
指令可以分为操作码字段和地址码字段
- 操作码字段负责告诉计算机执行什么操作
- 地址码字段负责
- 存放操作数或操作数地址
- 存放运算结果的地址
- 给出后继指令地址
- 操作码和地址码的位数不确定,需要更具具体的指令来决定
可以根据地址码字段结构的不同,分为四地址指令、三地址指令、二地址指令、一地址指令和零地址指令。
4、寻址方式
立即寻址
所需的操作数由指令直接给出的寻址方式,称为立即寻址,如
把立即数1234H放入R1寄存器中
MOV R1, 1234H
直接寻址
地址码为操作数所在主存单元的实际地址的寻址方式,称为直接寻址,如
把地址为1234H单元中的数据放入到R1寄存器中
MOV R1, (1234H)
间接寻址
地址码部分给出的是存放操作数地址的内存单元的地址,这个地址叫做间接地址。通过间接地址来寻址的方式称为间接寻址。如
把存放在地址为1234H内存单元中的地址取出,然后再通过该地址取找到需要的立即数,然后再将该立即数放入R1寄存器中
MOV R1, ((1234H))
寄存器直接寻址
指令所需的操作数在寄存器中,按指令给出的寄存器地址去获取操作数的寻址方式,称为寄存器直接寻址,如
把R2寄存器中的数据放入R1寄存器中
MOV R1, R2
寄存器间接寻址
寄存器中存放了操作数在内存单元中的地址,通过寄存器获得立即数在内存单元中的地址,然后通过地址得到立即数的寻址方式,称为寄存器间接寻址,如
把BX寄存器中存放的数据取出,通过该数据找到内存单元中对应位置中存放的立即数
MOV R1, (R2)
自增型寄存器间接寻址
和寄存器间接寻址类似,不过在取出寄存器中存放的地址后,需要该地址的值+1,然后再放回该寄存器中,如
MOV R1, (R2)+
自减型寄存器间接寻址
和寄存器间接寻址类似,不过在取出寄存器中存放的地址时,需要将改地址-1,使用后需要将地址放回寄存器中,如
MOV R1, -(R2)
自增/自减型寄存器间接寻址的区别
自增型寄存器间接寻址在取出寄存器中存放的数据后,直接使用该数据。使用完毕后,将该数据+1后再放回寄存器中。类似于
x++
自减型寄存器间接寻址在取出寄存器中存放的数据后,先将数据-1,然后再使用。使用后将该数据放回到寄存器中。类似于
--x
变址寻址
选用专用寄存器(IX)或通用寄存器(R0)用于存放偏移地址。将寄存器中的值加上基准地址的值(D)来作为最终地址的寻址方式,称为变址寻址。
如
选用专用寄存器IX作为变址寄存器,目标地址为
EA = (IX) + D
选用通用寄存器R0作为变址寄存器,目标地址为
EA = (R0) + D
基址寻址
基址寻址和变址寻址相反,寄存器中存放的是基准地址,D中存放的是偏移地址。该寻址方式称为基址寻址。如
选用专用寄存器BR作为基址寄存器,目标地址为
EA = (BR) + D
选用通用寄存器R0作为基址寄存器,目标地址为
EA = (R0) + D
变址/基址寻址的区别
无论是变址寻址还是基址寻址,目标地址 = 基准地址 + 偏移地址 ,只不过在不同的寻址方式中,由不同的寄存器和形式地址给出。
- 变址寻址中,由寄存器提供偏移地址,D提供基准地址
- 基址寻址中,由寄存器提供基准地址,D提供偏移地址
相对寻址
相对寻址是基于基址寻址的一种寻址方式,是一种由程序计数器PC给出基准地址,D给出偏移地址的寻址方式。
堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)”原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。
二、指令流程
1、流程中会用到的寄存器
Ri Rj:通用寄存器,用于存放源操作数或元操作数地址
C:暂存器C,用于暂存数据
D:暂存器D,用于暂存数据
MAR:地址寄存器,用于存放地址
MDR:数据寄存器,用于存放从主存读取出来的数据数据
PC:程序计数器,指向下一条指令的地址
2、指令流程的划分
由数据通路可以将指令的执行过程分为4个基本的阶段
- 取指令周期FT
- 源操作数周期ST
- 目的操作数周期DT
- 执行周期ET
3、取指令周期FT
取指令周期为指令流程的公操作。具有两个步骤,在一个时钟周期内完成。
步骤一:将主存中的指令读取,放入指令寄存器IR中
步骤二:程序计数器+1,指向下一条指令的地址
M->IR
PC+1->PC
4、源操作数周期ST
该周期主要是为了得到源操作数的值
以MOV指令为例
寄存器直接寻址 R
因为寄存器中存放的就是源操作数,所以直接取出即可
寄存器间接寻址 (R)
因为寄存器中存放的是源操作数在内存单元中的地址,所以我们需要通过寄存器,访问对应的内存单元,然后获得源操作数。
先将寄存器中的值放入地址寄存器中 Ri -> MAR
通过地址寄存器访问对应的内存单元,将单元中的值放入数据寄存器中 M->MDR ,然后通过数据寄存器中放入暂存器C中 MDR->C
自增/自减型寄存器间接寻址 (R)+/-(R)
和寄存器间接寻址类似,只不过多了一个自增/自减的步骤
自增型寄存器间接寻址在取出源操作数后,要将寄存器中存储的值+1,再放回该寄存器中
自减型寄存器间接寻址在取出寄存器中的值前,要将寄存器中存储的值-1,然后以-1后的值进行寻址操作,获取源操作数
自增型寄存器双间接寻址 @(R)+
这种寻址方式需要两次访问主存,才能获得源操作数的最终地址
先将寄存器中的值放入地址寄存器中 Ri -> MAR
通过地址寄存器访问对应的内存单元,将单元中的值放入数据寄存器中 M->MDR ,然后通过数据寄存器中放入暂存器C中
MDR->C,此时C中存放的是源操作数的地址
寄存器中存储的值+1,再放回该寄存器中 Ri+1 -> Ri
再次进行寄存器间接寻址 C -> MAR
通过地址寄存器访问对应的内存单元,将单元中的值放入数据寄存器中 M->MDR ,然后通过数据寄存器中放入暂存器C中 MDR->C
变址寻址 X(R)
变址寻址需要将寄存器中的值加上基准地址的值(D)来作为最终地址
公操作进行了 PC+1 -> PC,所以当前PC保存的是寄存地址D的值。先将基准地址取出 PC -> MAR,放入到暂存器C中
M -> MDR ->C
PC指向下一条指令的地址 PC + 1 -> PC
偏移地址+基准地址 获得最终地址 C+R -> MAR
将结果放入暂存器C中 M -> MDR -> C
经过源操作数周期ST后,暂存器C中保存了源操作数的值
5、目的操作数周期DT
该步骤主要是为了找到目的操作数的地址
寄存器直接寻址 R
直接放入寄存器中,无需目的操作数地址
寄存器间接寻址 (R)
取出寄存器中存放的目的地址,将该地址放入MAR中 Rj -> MAR
自增/自减型寄存器间接寻址 (R)+/-(R)
和寄存器间接寻址类似,将地址放入了MAR中,只不过多了自增/自减的步骤
自增型寄存器双间接寻址 @(R)+
- 通过寄存器中存放的地址,访问主存单元 Rj -> MAR
- 访问后Rj寄存器中的值+1 Rj +1 -> Rj
- 将主存单元中的值取出,放入到地址寄存器中。 M->MDR->MAR
变址寻址 X(R)
公操作进行了 PC+1 -> PC,所以当前PC保存的是寄存地址D的值。先将基准地址取出 PC -> MAR,放入到暂存器D中
M -> MDR ->D
PC指向下一条指令的地址 PC + 1 -> PC
偏移地址+基准地址 获得最终地址 D+R -> MAR
6、执行周期ET
将源操作数放入目的寄存器或目的主存单元中
寄存器直接寻址
Ri中的内容直接放入Rj中
目的间接寻址,源直接寻址
将源操作数通过数据寄存器放入主存中
目的直接寻址,源间接寻址
将暂存器C中存放的值放入目的寄存器Rj中
目的、源都为间接寻址
将暂存器C中存放的值放入数据寄存器中,通过数据寄存器放入主存单元中
公操作 PC -> MAR
程序计数器寻找下一条指令的地址
三、中断
1、什么是中断
在处理器中,中断是一个过程,即CPU在正在执行程序过程中,遇到外部/内部紧急事件需要处理,暂时中止当前程序执行转而去为事件服务,待服务完毕,再返回到暂停处(断点)继续执行原来的程序。
2、几个概念
断点
一个地址,程序在该处中断,转而取执行中断程序的地址
中断源
引起中断的信号源
中断服务程序
中断后需要去执行的程序
中断请求
中断服务程序发出的请求,请求CPU中断正在执行的程序,转而去执行该程序
中断响应
CPU做出响应,中断正在执行的程序,转而去执行中断服务程序的过程
现场保护
将中断前的现场保存起来,便于执行完中断服务程序后,可以继续执行中断前的程序
中断处理
执行中断服务程序
恢复现场
恢复到中断前的样子
中断返回
继续执行中断前正在执行的程序
3、中断流程
关中断
进入不可再次响应中断的状态,由硬件自动实现。因为接下去要保存断点,保存现场。在保存现场过程中,即使有更高级的中断源申请中断,CPU也不应该响应;否则如果现场保存不完整,在中断服务程序结束之后,也就不能正确地恢复现场并执行现行程序保存断点,保存现场
为了在中断处理结束后能正确地返回到中断点,在响应中断时,必须把当前的程序计数器PC中的内容(即断点)保存起来判别中断源,转入中断服务程序
在多个中断源同时请求中断的情况下,本次实际响应的只能是优先权最高的那个中断源。所以需要进一步判别中断源,并转入相应的中断服务程序入口开中断
因为接下去就要执行中断服务程序,开中断将允许更高级中断请求得到相应,实现中断嵌套执行中断服务程序
不同中断源的中断服务程序是不同的,实际有效的中断处理工作是在此程序段中实现的退出中断
在退出时,又应该进入不可中断状态,即关中断,恢复现场,恢复断点,然后开中断,返回原程序执行
进入中断时执行的关中断,保存断点等操作一般是由硬件实现的,它类似于一条指令,但它与一般的指令不同,不能被编写在程序中。因此,常常称为“中断隐指令”
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!