五、指令系统

1.指令格式

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

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

    指令需要解决的问题:

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

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

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

  • 指令格式的具体构成

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

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

    • $ 3 $种指令操作码部分不得重叠,否则无法区分;
    • 设双操作数地址码长度为$ 8 $,每个操作数的长度为$ 12 $,双地址指令数为$ k $, 显然$ k\lt 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 $接口状态,根据状态进行不同处理