指令流程和中断

一、指令系统

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 协议 ,转载请注明出处!

注解与反射 Previous
MySQL高级 Next