第14讲-指令系统

指令

  1. 指令的要素
    • 操作码:指定将要完成的操作
    • 源操作数引用:操作会涉及一个或多个源操作数,这是操作所需的输入
    • 结果操作数引用:操作可能会产生一个结果
    • 下一指令引用:告诉处理器这条指令执行完成后到哪儿去取下一条指令
  2. 指令表示
    • 在计算机内部,指令由一个位串来表示
    • 指令格式:对应于指令的各要素,这个位串划分成几个字段
      • 大多数指令集使用不止一种指令格式
    • 机器指令符号表示法:
      • 操作码被缩写成助记符来表示
        • MUL:乘,DIVDIV:除,LOAD:由存储器装入,STOR:保存到存储器
      • 操作数也可以用符号表示
        • 用寄存器编号或内存地址替换操作数
  3. 指令格式
    651034a6bb34e059875eb0098f8a0bd
    • 定长操作码:𝒏位操作码字段的指令系统最大能够表示𝟐 𝒏 条指令
    • 可变长操作码
      • 扩展操作码:不同地址数的指令具有不同长度的操作码

        15条三地址指令操作码:0 0 0 0 ~ 1 1 1 0
        15条二地址指令操作码:1 1 1 1 0 0 0 0 ~ 1 1 1 1 1 1 1 0
        15条一地址指令操作码:1 1 1 1 1 1 1 1 0 0 0 0 ~ 1 1 1 1 1 1 1 1 1 1 1 0
    • 指令格式通过它的各个构成部分来定义指令的位安排
    • 一个指令格式必须包含一个操作码,以及隐式或显式的、零个或多个操作数
    • 指令格式必须显式或隐式地为每个操作数指定其寻址方式
    • 大多数指令集使用不止一种指令格式
    • 例题:假设指令字长为16 位,操作数的地址码为6 位,指令有零地址、一地址、二地址3 种格式。
      • 设操作码固定,若零地址指令有M 种,一地址指令有N 种,则二地址指令最多有几种?
        操作码位数:16 - 6 - 6 = 4
        总指令条数:2^4 = 16
        二地址指令最多:16 - M - N
      • 采用扩展操作码技术,二地址指令最多有几种?
        0000 ~ 1110
      • 采用扩展操作码技术,若二地址指令有P 条,零地址指令有Q 条,则一地址指令最多有几种?
        $𝑄=[(2^4-𝑃) × 2^6-𝑅] × 2^6$
  4. 操作码
    • 差异:不同的计算机上操作码的数目变动是很大的
    • 共性:所有计算机上都会存在相同的常用操作类型
    • 数据传送
      • 指明源和目标操作数的位置
      • 指明将要传送数据的长度
      • 指明每个操作数的寻址方式
        image-20231215225455850
    • 算术运算
      • 一条算术指令的执行会涉及数据传送操作,来为算术和逻辑单元准备输入,并传送逻辑单元的输出
        image-20231215225551293
    • 逻辑运算
    • 位操作:操作一个字或其它可寻址单元的中的个别位
    • 移位和旋转
      image-20231215225656478
    • 输入/输出
      • 各种输入/输出方法仅有少数输入/输出指令实现,具体操作由参数、代码或命令字指定
        image-20231215225740670
    • 控制转移
      • 分支指令(亦称为跳转指令):把将要执行的下一条指令的地址作为它的操作数之一
      • 跳步指令:包含一个隐含地址,该隐含地址等于下一指令地址加上该指令长度之和
      • 过程调用指令:涉及由目前位置转移到过程的调用指令和由过程返回到调用发生位置的返回指令
        image-20231215225810362
  5. 操作数
    • 常见类型:地址、数值、字符、逻辑数据
    • 地址
      • 一个指令需要有4 个地址引用:2 个源操作数,1 个目的操作数,以及下一指令地址
        • 下一指令地址可以是隐含的
        • 源操作数可以和目的操作数是相同的
      • 地址数量
        • 每条指令中的地址数目越少
          • 指令的长度越短,不需要复杂的CPU
          • 使程序总的指令条数更多,导致执行时间更长,程序也更长更复杂
        • 对于多地址指令,普遍具有多个通用寄存器可用,允许某些运算只使用寄存器即可完成,从而使执行加快
    • 数值
      • 计算机存储的数值是受限的
        • 机器可表示数值的幅值是有限的
        • 浮点数情况下数值精度是有限的
      • 数值数据的类型
        • 二进制整数或定点数
        • 二进制浮点数
        • 十进制数
    • 字符
      • 国际参考字母表(IRA)/ 美国信息交换标准码(ASCII):每个字符被表示成唯一的7 位二进制串
      • 扩展的二进制编码的十进制交换码(EBCDIC):8 位编码
      • 统一码(Unicode):16 位/ 32 位
    • 逻辑数据
      • 将一个n 位单元看成是由n 个1 位项组成,每项有值0 或1
        • 存储一个布尔或者二进制数据项序列,序列中的每个值只能取值1(真)或0(假)
        • 有利于实现对数据项的具体位进行操纵
    • 大端序和小端序
      • 假设有32 位的十六进制值1234567812345678,将它存储在可字节寻址的存储器地址184 处
        521f09061e51fd9fb6ac72c325b2545
      • 在两种策略中每个数据项有同样地址(范围)
      • 在任何一个给定的多字节值中,小端的字节排序是大端的反序,反之亦然
      • 端序不影响结构中数据项的次序
  6. 寻址方式
    • 立即寻址
      • 方式:操作数实际值出现在指令中
      • 用法:定义和使用常数或设置变量的初始值
      • 算法:操作数= A
      • 优点:快,除了取指令之外,获得操作数不要求另外的存储器访问
      • 缺点:数的大小受限于地址字段的长度
    • 直接寻址
      • 方式:地址字段含有操作数的有效地址
      • 用法:早期计算机常用,在当代计算机体系结构中不多见
      • 算法:EA = A
      • 优点:只要求1 次存储器访问,且无需为生成地址而专门计算
      • 缺点:有限的地址空间
        bd7ded68154fce663598c44ebafe185
    • 间接寻址
      • 方式:地址字段指示一个存储器字地址, 而此地址出保存有操作数的全长度地址
      • 算法:EA = (A)
      • 优点:扩大了地址空间
      • 缺点:取操作数需要2 次访问存储器
      • 解释:地址引用的数量限制可能是有益的
        eeda2a141f785936e4bb0bcb8d753a3
    • 寄存器寻址
      • 方式:地址字段指示的是寄存器
      • 算法:EA = R
      • 优点:指令中仅需要一个较小的地址字段, 且不需要存储器访问
      • 缺点:地址空间十分有限
      • 解释:寄存器寻址只有在被有效使用的时候才有意义
        7ba579c2a8dcf17e84bb69ea3c44ef4
    • 寄存器间接寻址
      • 方式:地址字段指示寄存器
      • 算法:EA = (R)
      • 优点:扩大了地址空间,比间接寻址少1 次存储器访问
      • 缺点:相对于寄存器寻址,需要多1 次存储器访问
        b4e7fe96b05afc5716beeebe605ea5d
    • 偏移寻址
      • 方式:结合直接寻址和寄存器间接寻址能力
      • 算法:EA = (R) + A
      • 类型
        • 相对寻址
          • 方式:隐含引用的寄存器是程序计数器(PC)
          • 此指令后续的下一条指令的地址加上地址字段的值产生有效地址
          • 用法:大多数存储器访问都相对靠近正在执行的指令,相对寻址可节省指令中的地址位数;可用于转移控制指令。
          • 算法:EA = (PC) + A
          • 优点:利用程序局部性原理,节省指令中地址的位数
            5631d9890ccaab93238948c8af96873
        • 基址寄存器寻址
          • 方式:被引用的寄存器含有一个存储器地址,地址字段含有一个相对于那个地址的偏移量(通常是无符号整数表示)
          • 寄存器引用可以是显式的,也可以是隐式的
          • 算法:EA = (B) + A
          • 用法:虚拟内存空间中的程序重定位
            c8d29de812d20e07ed79cab5deca558
        • 变址寻址
          • 方式:指令地址字段引用一个主存地址,被引用的寄存器含有对于该地址的一个正的偏移量
          • 算法:EA = A + (IX)
          • 用法:为完成重复操作提供一种高效机制
          • 扩展:结合间接寻址和变址寻址
            • 前变址:EA = (A + IX ));后变址:EA = (A) + IX
              58df44c9b28ef764dbaf9d242d94406
        • 栈寻址
          • 方式:栈指针保存在寄存器中,对寄存器中栈位置的访问实际上是一种寄存器间接寻址方式
          • 解释:与栈相关的是一个指针,它的值是栈顶地址,或者当栈顶的两个元素已在CPU 寄存器内,此时栈顶指针指向栈顶的第三个元素
            ad44b934e146b4ccb0694ef4faec0b0

            指令格式

  7. 指令格式的设计原则
    • 指令尽量短
      • 程序占用存储空间小
    • 有足够的操作码位数
      • 要为操作类型不断增加预留
    • 操作码的编码必须有唯一的解释
      • 操作码译码时要么是唯一的合法编码,要么是不合法的
    • 指令长度是字节的整数倍
      • 与内存按照字节寻址相对应,便于指令的读取和地址计算
    • 合理选择地址字段的个数
      • 涉及到指令长度和规整性,是空间和时间开销权衡的结果
    • 指令尽量规整
      • 简化硬件的实现
  8. 指令长度
    • 最明显的权衡考虑是在强有力的指令清单和节省空间之间进行
    • 编程人员希望更多的操作码、更多的操作数、更多的寻址方式和更大的地址范围
    • 指令长度变短可以节省存储空间和减少数据传送时间
    • 指令长度应该是字符长度或定点数长度的整数倍(比如n 个字节)
    • 指令长度应该等于存储器的传送长度(即数据总线宽度),或者这两个值其中之一是另一个的整数倍
  9. 位的分配
    • 对于给定的指令长度,在操作码数目和寻址能力之间存在着权衡考虑
    • 使用变长的操作码
      • 使用一个最小操作码长度,但是对于某些操作码,可通过使用指令附加位的方法来指定附加的操作
    • 使用寻址位的考虑因素
      • 支持的寻址方式的种数
      • 操作数的数量:数量多,则操作数的位数短
      • 寄存器与存储器比较:能用于操作数引用的寄存器越多,指令需要的位数越少
      • 寄存器组的数目:对于固定数目的寄存器 功能上的分开将使指令只需较少的位数
      • 地址范围:比如间接寻址可以增大范围
      • 寻址粒度:同样大的寻址空间,使用较大的字时,需要的地址位更少
  10. 变长指令
    • 提供不同长度的各种指令格式
    • 优点
      • 易于提供大的操作码清单,而操作码具有不同的长度
      • 寻址方式能更灵活,指令格式能将各种寄存器和存储器引用加上寻址方式予以组合
    • 缺点
      • 增加了CPU 的复杂程度(效率也会降低)
    • 取至少等于最长指令长度的几个字节或几个字

指令集设计

  1. 指令集的设计是件很复杂的事情,影响计算机系统的诸多方面
    • 指令集定义了处理器应完成的多数功能,对处理器的实现有着显著的影响
    • 指令集是程序员控制处理器的方式,设计时必须考虑程序员的要求
  2. 设计的基本原则
    • 完备性/完整性:操作类型应当尽可能完备,但太复杂了也会给硬件实现增加困难
    • 兼容性:应当兼容以前的指令系统,为软件重复利用带来方便
    • 均匀性:应当能对多种类型的数据进行处理
    • 可扩充性:操作码要预留一定的编码空间
  3. 设计的基本问题
    • 操作指令表:应提供多少和什么样的操作,操作有多复杂
    • 数据类型:对哪几种数据类型完成操作
    • 指令格式:指令的位长度、地址数目、各个字段的大小等
    • 寄存器:能被指令访问的寄存器数目以及它们的用途
    • 寻址:寻址方式的种类以及有效地址的计算
    • 下一条指令地址的确定:通常通过PC 寄存器实现