五、指令系统

1.指令格式

  • 指令字:表示一条指令的机器字,简称指令

  • 指令格式:用二进制代码表示指令的结构形式

    指令需要解决的问题:

    操作数——指令要求计算机处理什么数据;

    操作码——指令要求计算机对数据做什么处理;

    寻址方式——计算机怎样才能得到要处理的数据

  • 指令格式的具体构成

    • 操作码字段长度决定指令系统规模
      • 每条指令对应一个操作码
      • 定长操作码:$Length_{OP}=\lceil log_2n\rceil$
      • 变长操作码:操作码向不用的地址码字段扩展
    • 操作数字段可能有多个
      • 寻址方式字段:长度与寻址方式种类有关,也可能隐含在操作码字段
      • 地址码字段:作用及影响、长度和寻址方式有关
  • 指令字长度

    • 指令字长度:指令中包含二进制代码的位数
    • 字长与机器字的长度有关: 单字长,双字长,半字长
      • 指令字越长,地址码长度越长,可直接寻址空间越大
      • 指令字越长,占用空间越大,取指令越慢
    • 定长指令: 结构简单,控制线路简单,如$MIPS$指令
    • 变长指令: 结构灵活,充分利用指令长度,控制复杂,如$X86$指令
  • 指令地址码

    • $3$种指令操作码部分不得重叠,否则无法区分;
    • 设双操作数地址码长度为$8$,每个操作数的长度为$12$,双地址指令数为$k$, 显然$k<2^8$,则$2^8-k$为多余状态,可用于表示其他类型指令,即可用于单操作数指令的条数为$(2^8-k)*2^{12}$,$2^{12}$是多余$12$位组合;
    • 例:设某指令系统指令字长$16$位,每个地址码为$6$位。若要求设计二地址指令$15$条、一地址指令$34$条,则最多还可设计多少条零地址指令。

2.寻址方式

(1)指令寻址

①顺序寻址
  • 程序计数器$(PC)$对指令序号进行计数
  • 程序计数器对程序员可见
  • $PC$存放下条指令地址,初始值为程序首址
  • 执行一条指令时,$PC$=$PC$+当前指令字节长度
  • 综上,也即$Mem[PC++]\rightarrow IR$
②跳跃寻址
  • 下条指令地址不是$PC++$得到,而是由指令本身给出
  • 跳跃的处理方式是重新修改$PC$的内容,然后进入取指令阶段
  • 注意偏移量可能为正,也可能为,偏移量应以$PC++$后的值计算

(2)操作数寻址

  • 立即寻址:地址码字段是操作数本身

    如$MOV\enspace AX,38H$对应指令如下:

  • 寄存器寻址:操作数在$CPU$的内部寄存器中

    如$PUSH\enspace AX$对应指令如下:

  • 直接寻址:地址码字段直接给出操作数在内存的地址

    如$INC\enspace [200]$对应指令如下:

  • 间接寻址:$D$单元的内容是操作数地址, $D$是操作数地址的地址

    如下图示意:

  • 寄存器间接寻址:$D$单元的内容是操作数的地址,$R$是操作数地址的地址

    如$INC\enspace [BX]$对应指令如下:

  • 相对寻址:指令中的$D$加上$PC$的内容作为操作数的地址

  • 基址$/$变址寻址:操作数地址为基址$/$变址寄存器$+$偏移量

    如$MOV\enspace AX,32[SI]$对应指令如下:

    • 基址寄存器一般不修改
    • $SI,DI$都称为变址寄存器
  • 寻址对比

  • 寻址方式举例

3.指令格式设计

  • 设计步骤

    • 根据指令规模及是否支持操作码扩展,确定操作码字段长度
    • 根据对操作数的要求确定地址码字段的个数
    • 根据寻址方式的要求,为各地址码字段确定寻址方式字段长度
    • 确定定长指令还是变长指令
  • 设计举例

    • 字长$16$位,主存$64K$,指令单字长单地址,$80$条指令。寻址方式有直接、间接、相对、变址。请设计指令格式。

    • 某机字长$32$位,采用三地址指令,支持$8$种寻址操作,完成$60$种操作,各寻址方式均可在$2K$主存范围内取得操作数,并可在$1K$范围内保存运算结果。问应采用什么样的指令格式?指令字长最少应为多少位?执行一条直接寻址模式指令最多要访问多少次主存?

    • 分析以下指令格式及寻址方式特点?

      • 1)二地址指令;
      • 2)操作码可指定$16$条指令;
      • 3)源和目的均有$8$种寻址方式;
      • 4)源地址寄存器和目的地址寄存器均有$8$个;
      • 5)可寻址范围为$1\sim 64K$(与机器字长有关)

4.$MIPS$指令系统

(1)$CISC$与$RISC$

  • $CISC$ $(Complex\enspace Instruction\enspace System\enspace Computer)$
    • 复杂指令系统计算机;
    • 指令数量多,指令功能,复杂的计算机;
    • $Intel\enspace X86$
  • $RISC(Reduced\enspace Instruction\enspace System\enspace Computer)$
    • 精简指令系统计算机;
    • 指令数量少,指令功能单一的计算机;
    • $1982$年后的指令系统基本都是$RISC$;
    • $MIPS,RISC-V$
  • $RISC$的特点
    • 指令条数少,只保留使用频率最高的简单指令,指令定长
      • 便于硬件实现,用软件实现复杂指令功能
    • $Load/Store$架构
      • 只有存/取数指令才能访问存储器,其余指令的操作都在寄存器之间进行
      • 便于硬件实现
    • 指令长度固定,指令格式简单、寻址方式简单
      • 便于硬件实现
    • $CPU$设置大量寄存器$(32\sim 192)$
      • 便于编译器实现
    • 一个机器周期完成一条机器指令
    • $RISC\enspace CPU$采用硬布线控制,$CISC$采用微程序

(2)$MIPS$指令概述

(3)$MIPS$寻址方式

  • 立即数寻址

  • 寄存器直接寻址

  • 基址寻址

    • 使用基址寻址的指令:$lw ,sw, lh, sh, lb, lbu$等
  • 相对寻址

    • 使用用相对寻址的指令:$beq, bne$
  • 伪直接寻址(页面寻址)

  • 使用伪直接寻址的指令:$j,jal$

(3)$R$型指令

  • 指令格式
  • 指令举例

(3)$I$型指令

  • 指令格式

  • 指令举例

(4)$J$型指令

七、输入输出系统

1.外设与I/O接口

  • 输入输出设备是计算机与人或者机器系统进行数据交互的装置,用于实现计算机内部二进制信息与外部不同形式信息的转换,简称外部设备或外设

  • 计算机的输入/输出系统

    • 包括外部设备、接口部件、总线以及相应的管理软件,简称$I/O$系统
    • 保证$CPU$能够正确选择$I/O$设备并实现对其控制,与数据传输
    • 利用数据缓冲、合适的数据传送方式,实现主机外设间速度匹配
  • $I/O$接口

    • 连接总线与$I/O$设备的物理和逻辑界面

    • 既包括物理连接电路,也包括软件逻辑接口

    • 所有设备均通过$I/O$接口(总线接口)与总线相连

    • $CPU$使用设备地址经总线与$I/O$接口通信访问$I/O$设备

  • $I/O$接口编址

    • 统一编址
      • 内存映射编址$(Memory-mapped)$
      • 外设地址与内存地址统一编址,同一个地址空间
      • 不需要设置专用的$I/O$指令
      • 采用访存指令访问外设,具体访问什么设备取决于地址
      • 如$MIPS$指令系统
    • 独立编址
      • 端口映射编址$(Port-mapped)$
      • $I/O$地址空间与主存地址空间相互独立
      • $I/O$地址又称为$I/O$端口
      • 不同设备中的不同寄存器和存储器都有唯一的端口地址
      • 使用$I/O$指令访问外设
      • 如$X86$指令系统中的$OUT$和$IN$指令
  • $I/O$接口软件

    • 现代计算机中用户必须通过操作系统间接访问设备,屏蔽设备细节,使用更方便
    • 与$OS$无关的$I/O$库 (用户态)
      • 如$C$语言中的标准$I/O$库$stdio.h$
      • printf、scanf、getchar、putchar、fopen、fclose等
      • 用户程序主要通过调用$I/O$库访问设备,方便程序在不同$OS$间移植
    • 与设备无关的$OS$调用库(内核态)
      • open、read、write、seek、ioctl、close
    • 独立的设备驱动程序(内核态)
      • 设备驱动程序是与设备相关的$I/O$软件部分
      • 不同设备对应不同的驱动程序
      • 遵循具体设备的$I/O$接口约定,包含设备接口细节

2.程序查询方式

  • 程序查询方式中$CPU$与$I/O$设备的交互完全通过$CPU$执行程序完成;

  • 程序查询方式分为独占查询和定时查询;

  • 独占查询方式

    • 假设$CPU$执行某用户程序时,需要访问$I/O$设备;
    • 这时,$CPU$通过对$I/O$设备发送命令参数以启动设备
    • 设备收到启动命令后,开始相对于$CPU$速度而言很漫长的数据准备过程;
    • 从启动设备到设备就绪的时间,$CPU$只能反复读取设备的状态寄存器,判断设备是否就绪;
    • 如果没有就绪则继续读取状态字,这种方式称为轮询等待$(busy-waiting)$;
    • 一旦设备就绪,用户程序就可以通过相应的$I/O$指令读取特定端口中的数据,完成实际的数据传输
    • 一次轮询只能完成一个数据单元的传输
    • $CPU$浪费了大量的时间进行查询,对于慢速设备,这种方式并不合适;
    • 而对于高速设备或者简单设备,这种方式较为合适。
  • 定时查询方式

    • 应用定时中断技术;
    • 当$CPU$启动设备时,同时启动一个定时器;
    • 设备准备数据的过程中,$CPU$不再轮询等待,而是进行进程调度,将当前进程加入$I/O$等待队列,并调度新的用户进程$P_2$运行;
    • 定时器时间到时,产生定时中断,定时中断会触发$CPU$中断用户进程$P_2$或者其他进程,而去执行定时中断服务程序;
    • 中断服务程序的任务是查询设备状态,如果设备没有准备就绪,继续启动新的定时中断,如果设备准备就绪,则唤醒进程$P_1$,中断服务完毕,继续执行用户进程$P_2$;随着时间片的轮转,用户进程$P_1$会被进程调度程序重新调度运行,该程序会完成实际数据传输。
    • 需要设定定时中断的计时时长

3.程序中断方式

(1)工作原理

  • 提高了$CPU$的使用效率
    • 主动告知机制避免了反复查询设备状态
    • 仍需$CPU$占用(中断服务子程序运行时间+中断开销)
  • 适合随机出现的服务
  • 需要专门的硬件

(2)中断实现

①中断原理
  • $CPU$暂时中止现行程序的执行,转去执行为某个随机事件服务的中断处理子程序,处理完后自动恢复原程序的执行
  • 中断执行时间:一条指令执行完毕后进入公操作,以检查是否需要响应中断
②中断处理流程
③中断优先级
  • 多设备同时产生中断请求时,如何处理?

    • 优先级高的先响应,优先级低的后响应

    • $CPU$优先级随不同中断服务程序而改变

      执行某设备中断服务子程序,$CPU$优先级就与该设备的优先级一样

    • 中断嵌套:优先级高的中断请求可以中断优先级低的程序

  • 举例:设优先级$A>B>C$

    • 单级中断

    • 多重中断

  • 划分优先级的规律

    • 硬件故障中断属于最高级,其次是程序错误中断
    • 非屏蔽中断优先于可屏蔽中断
    • $DMA$请求优先于$I/O$设备传送的中断请求
    • 高速设备优先于低速设备
    • 输入设备优先于输出设备
    • 实时设备优先于普通设备
④中断屏蔽
  • 响应优先级

    • $CPU$对各设备中断请求进行响应,并准备好处理的先后次序
    • 这种次序在硬件线路上已固定,不便变动
  • 处理优先级

    • $CPU$实际对各中断请求处理的先后次序
    • 如果不使用屏蔽技术,响应的优先次序就是处理的优先次序
    • 中断屏蔽技术可动态改变各设备的处理优先级
  • 中断屏蔽方式

    • 中断请求寄存器$IRR$
      • 对应位为$1$表示相应外设发出了中断请求
      • 中断字,中断码
    • 中断屏蔽寄存器$INM$
      • 对应位为$1$表示对相应设备设置屏蔽,否则取消屏蔽
      • 每个设备都有自己独立的中断屏蔽字
      • $CPU$执行某设备的中断服务子程序时将其中断屏蔽字载入$INM$
      • 不可屏蔽中断不受中断屏蔽寄存器的控制
    • 中断允许触发器$IE$
      • 允许中断源中断$CPU$
    • 屏蔽码
      • 控制各设备接口的屏蔽触发器,可改变处理次序
      • 屏蔽码的每一位都表示对某个设备是否进行屏蔽
      • 运行某个设备的中断服务程序时载入对应的屏蔽码
      • 某设备的屏蔽码中的$1$的个数越多,表示处理优先级越高
⑤中断仲裁
  • 同一时刻可能有多个设备同时发出中断请求,响应哪个中断源?

    • 链式查询
    • 独立请求
    • 中断控制器方式
    • 分组链式结构
  • 请求方式

    • 独立请求:向量中断
      • 将服务程序入口(中断向量)组织在中断向量表中;
      • 硬件查询法:响应时由硬件直接产生中断号(向量地址),查中断向量表取得服务程序入口,转入相应服务程序。
    • 中断共享:非向量中断
      • 将服务程序入口组织在查询程序中;
      • 程序识别法:响应时执行查询程序查询中断源,查询特定端口$(GPIO)$识别中断源
⑥中断处理实现
  • 中断处理中的问题

    • 中断响应条件
      • 中断允许触发器$IE=1$
      • 对应的中断未被屏蔽
      • 无更高优先级的$DMA$请求
      • 中断嵌套必须优先级更高
      • 指令已经执行完最后一个机器周期
        • 保证指令执行的完整性
        • 缺页异常的处理时机与此不同
    • 保存现场,恢复现场
      • 中断程序用到的通用寄存器,$EPC$,屏蔽字
      • 缺页异常的断点和外部中断断点不一致
    • 中断过程由软硬件结合完成
  • 中断控制器

  • 中断控制器处理流程

4.$DMA$方式

(1)基本概念

  • $DMA$方式与中断方式
    • 中断方式
      • 传送一个数据执行一次中断服务子程序(几十条指令)
      • 效率低下,不适合于高速传输的系统
    • $DMA$方式
      • 外设与主存间建立一个由硬件管理的数据通路
      • 这个数据通路是虚拟通路,仍通过系统总线进行数据传输
      • $CPU$不介入外设与主存的数据传送操作
      • 减少$CPU$开销,提升效率
    • 二者的区别
      • 中断通过程序传送数据,$DMA$靠硬件来实现
      • 中断时机为两指令之间,$DMA$响应时机为两存储周期之间
      • 中断不仅具有数据传送能力,还能处理异常事件,$DMA$只能进行数据传送
      • $DMA$仅挪用了一个存储周期,不改变$CPU$现场
      • $DMA$请求的优先权比中断请求高
        • $CPU$优先响应$DMA$请求,是为了避免$DMA$所连接的高速外设丢失数据
      • $DMA$利用了中断技术
  • $DMA$方式下的访存冲突
    • 冲突原因
      • $DMA$控制器直接访问内存
      • $CPU$执行主程序,也需要访问内存
    • 处理冲突
      • 停止$CPU$使用主存
        • $DMA$传送数据时,$CPU$停止使用主存
        • 一批数据传送结束后,$DMA$再交还主存使用权
        • $DMA$传送过程中,$CPU$处于等待状态
        • $DMA$批量数据传输周期过长,$CPU$长期无法访问内存
        • 由于总线一次只能传输一个机器字,因此批量传输时需要循环传输
        • 由于外设的访问时间较慢,外设传送两个数据之间存在时间间隔
        • 而这个时间间隔大于存储周期,总线和内存未充分利用
      • $DMA$与$CPU$交替使用主存
        • 每个存储周期分成两段
          • 一段用于$DMA$访问主存
          • 一段用于$CPU$访问主存
        • 无主存使用权移交过程
      • 周期挪用法
        • $DMA$要求访问主存时,$CPU$暂停一个或多个存储周期;
        • 一个数据传送结束后,$CPU$继续运行;
        • $CPU$现场没有变动,仅延缓了指令的执行;
        • 如发生访存冲突,则$DMA$优先访问

(2)$DMA$传输

  • $DMA$控制器

  • $DMA$传输流程

    • 准备阶段($CPU$干预)

      主机通过$CPU$指令向$DMA$接口发送必要的传送参数,并启动$DMA$工作。

      • 数据传送的方向
      • 数据块在主存的首地址
      • 数据在外设存储介质上的地址
      • 数据的传送量
    • 传输阶段($CPU$不干预)

      宏观上,$DMA$是连续传送一批数据;微观上,每传送一个数据,发一次$DMA$请求。

      • 设备准备数据:当设备接收到$CPU$的$DMA$命令后就可以开始准备数据;
      • 设备发送$DMA$请求:数据准备就绪后,通过$DREQ$控制线向$DMAC$发出$DMA$请求;
      • $DMAC$申请总线:$DMAC$收到$DMA$请求后立即将$HOLD$信号置$1$,向$CPU$申请总线控制权;
      • 总线授权:$CPU$在机器周期结束后响应总线使用申请,让出总线控制权,并发出总线授权信号$HLDA$通知 $DMAC$;
      • $DMA$数据传输:收到$HLDA$信号将内存地址放置在地址总线上,设置控制总线读写命令控制信号,并向设备$DMA$发送应答信号$DACK$,设备收到$DACK$信号后会和内存完成一个机器字的数据交换;
      • 传输控制:设备传输完一次数据后会继续重复第$1$步到第$5$步的工作,$DMAC$在每次传输时还需要负责维护内存地址和传输计数器,并撤除$HOLD$信号释放总线;
      • 数据传输结束:$DMAC$会通过$INTR$信号线发送一个$EOP(End\enspace Of\enspace Process)$的$DMA$中断请求信号,告知$CPU$传输完成
    • 结束阶段($CPU$干预)

      • $DMA$在两种情况下都进入结束阶段
        • 正常结束,一批数据传送完毕
        • 非正常结束,$DMA$故障
      • 结束阶段$DMA$向主机发出中断请求
      • $CPU$执行中断服务程序
        • 查询$DMA$接口状态,根据状态进行不同处理