13_指令系统

Charlie

1. 指令

  • 指令是计算机处理的最基本单位
    • 操作码(指令执行的内容)+操作数(要操作的对象)
  • 多周期实现方案
    • 可以将一条指令的执行分解为一系列步骤
      • 取指令,译码/取寄存器,执行/有效地址/完成分支,访问内存, 存储结果

1.1. 指令要素

  • 操作码:指定将要完成的操作
  • 源操作数引用:操作会涉及一个或多个源操作数,这是操作所需的输入
  • 结果操作数引用:操作可能会产生一个结果
  • 下一指令引用:告诉处理器这条指令执行完成后到哪儿去取下一 条指令

1.2. 指令表示

  • 在计算机内部,指令由一个位串来表示
  • 指令格式:对应于指令的各要素,这个位串划分成几个字段
    • 一个指令集往往有多种指令格式
  • 机器指令符号表示法
    • 操作码被缩写成助记符来表示
    • 操作数也可以用符号表示
      • 用寄存器编号或内存地址替换操作数

2. 操作码

  • 所有计算机上都会存在相同的常用操作类型
    • 数据传送
    • 算术运算
    • 逻辑运算
    • 转换
    • 输入/输出
    • 系统控制
    • 控制转移

2.1. 数据传送

  • 指明源和目标操作数的位置
  • 指明将要传送数据的长度
  • 指明每个操作数的寻址方式
    75_VoIPSCreencastCoverWnd (2).png

2.2. 算数运算

  • 一条算术指令的执行会涉及数据传送操作,来为算术和逻辑 单元准备输入,并传送逻辑单元的输出
    76_VoIPSCreencastCoverWnd (2).png

2.3. 逻辑运算

  • 位操作:操作一个字或其它可寻址单元的中的个别位
  • 移位和旋转77_VoIPSCreencastCoverWnd (2).png
  • 算数移位和逻辑移位
    78_VoIPSCreencastCoverWnd (2).png

2.4. 输入/输出

  • 各种输入/输出方法仅有少数输入/输出指令实现,具体操作由参数、代码或命令字指定
    79_VoIPSCreencastCoverWnd (2).png

2.5. 控制转移

  • 分支指令(亦称为跳转指令)
    • 把将要执行的下一条指令的地址作为它的操作数之一
  • 跳步指令
    • 包含一个隐含地址,该隐含地址等于下一指令地址加上该指令 长度之和
  • 过程调用指令
    • 涉及由目前位置转移到过程的调用指令和由过程返回到调用发生位置的返回指令
      7a_VoIPSCreencastCoverWnd.png

3. 操作数

3.1. 地址

  • 一个指令需要有4个地址引用
    • 2个源操作数
    • 1个目标操作数
    • 下一指令地址(一般是隐含的)
  • 地址数量
    • 地址数目越少
      • 指令越短,对CPU要求越低
      • 使得程序总指令更多,导致执行时间更长,程序更长更复杂
    • 对于多地址指令,普遍采用多个通用寄存器
      例子
  • 3参数指令
    • 7b_VoIPSCreencastCoverWnd.png
  • 2参数指令
    • 7c_VoIPSCreencastCoverWnd.png
  • 1参数指令
    • 7d_VoIPSCreencastCoverWnd.png

3.2. 数值

  • 计算机存储的数值是受限的
    • 机器可表示数值的幅值是有限
    • 浮点数情况下数值精度是有限
  • 数值数据的类型
    • 二进制整数或定点数
    • 二进制浮点数
    • 十进制数

3.3. 字符

  • 国际参考字母表(IRA) / 美国信息交换标准码(ASCII): 每个字符 被表示成唯一的7位二进制串
  • 扩展的二进制编码的十进制交换码(EBCDIC):8位编码
  • 统一码(Unicode):16 位 / 32 位

3.4. 逻辑数据

  • 将一个n位单元看成是由n个1位项组成,每项有值0或1
    • 存储一个布尔或者二进制数据项序列,序列中的每个值只能取值1 (真)或0(假)
    • 有利于实现对数据项的具体位进行操纵

3.5. 大端序和小端序

  • 大端序:数据高位放在低地址
  • 小端序:数据高位放在高地址
  • 例子7e_VoIPSCreencastCoverWnd.png
  • 在两种策略中每个数据项有同样地址
  • 在任何一个给定的多字节值中,小端的字节排序是大端的反序,反之亦
  • 端序不影响结构中数据项的次序

3.6. 操作数引用

  • 操作数实际值
  • 操作数地址
    • 寄存器
    • 主存
    • 虚拟内存

4. 寻址方式

  • 直接寻址
  • 立即寻址
  • 间接寻址
  • 寄存器寻址
  • 寄存器间接寻址
  • 偏移寻址
  • 栈寻址

记号

  • A: 指令中地址字段的内容
  • R: 指向寄存器的指令地址字段内容
  • EA: 被访问位置的实际(有效)地址
  • (X): 存储器位置 X 或寄存器 X 的内容

4.1. 立即寻址

  • 方式
    • 操作数直接出现在指令中
    • 这种操作数又称为立即数
  • 用法
    • 定义和使用常数或设置变量的初始值
  • 算法
    • 操作数=A
  • 优点
    • 除了取指令之外,获得操作数不要求另外的存储器访问
  • 缺点
    • 数的大小受限于地址字段的长度
      7f_VoIPSCreencastCoverWnd.png
      直接寻址
  • 方式
    • 地址字段含有操作数的有效地址
    • 直接地址绝对地址
  • 用法
    • 早期计算机常用,在当代计算机体系结构中不多见
  • 算法
    • EA=A
    • 指令中地址字段为实际地址
  • 优点
    • 只要访问1此存储器
    • 不需要额外计算实际地址
  • 缺点
    • 地址空间有限(操作数位数)
      81_VoIPSCreencastCoverWnd.png

4.2. 间接寻址

  • 方式

    • 地址字段指示一个存储器字地址, 而此地址处保存有操作数的全长度地址
  • 算法

    • EA=(A)
  • 优点

    • 扩大地址空间
  • 缺点

    • 取操作数需要2此访问存储器
  • 解释

    • 地址引用的数量限制可能时有益的

capture-2023-02-06-16-32-06.jpg

4.3. 寄存器寻址

  • 方式
    • 地址字段指示的是寄存器
  • 算法
    • EA=R
  • 优点
    • 指令中仅需要一个较小的地址字段
    • 不需要存储器访问
  • 缺点
    • 地址空间十分有限,寄存器数量很少
  • 解释
    • 寄存器寻址只有在被有效使用的时候才有意义
      82_VoIPSCreencastCoverWnd.png

4.4. 寄存器间接寻址

  • 方式
    • 地址字段指示寄存器,寄存器记录存储器地址
  • 算法
    • EA=(R)
  • 优点
    • 扩大了地址空间
    • 比间接寻址少1次存储器访问
  • 缺点
    • 相对于寄存器寻址,需要多1次存储器访问
      83_VoIPSCreencastCoverWnd.png

4.5. 偏移寻址

  • 方式
    • 结合直接寻址和寄存器间接寻址
  • 算法
    • EA=(R)+A
    • 寄存器中基址+立即数偏移量
  • 类型
    • 相对寻址
    • 基址寄存器寻址
    • 变址
  • 解释
    • 偏移寻址要求指令有两个地址字段,至少其中一个是显式的
      84_VoIPSCreencastCoverWnd.png

4.5.1. 相对寻址

  • 方式
    • 隐含引用的寄存器是程序计数器(PC)
    • 此指令后续的下一条指令的地址加上地址字段的值产生有效地址
  • 用法
    • 大多数存储器访问都相对靠近正在执行的指令,相对寻址可节省指令中的地址位数
    • 目标地址位于该指令的前后固定位置上
  • 算法
    • EA=(PC)+A
  • 优点
    • 利用程序局部性
    • 节省地址位数

4.5.2. 基址寄存器寻址

  • 方式
    • 被引用的寄存器含有一个存储器地址,地址字段含有一个 相对于那个地址的偏移量(通常是无符号整数表示)
    • 寄存器引用可以是显式的,也可以是隐式的
  • 算法
    • EA=(B)+A
  • 用法
    • 虚拟内存空间中的程序重定位,虚拟地址转换到物理地址

4.5.3. 变址寻址

  • 方式

    • 指令地址字段引用一个主存地址,被引用的寄存器含有对于该地址的一个正的偏移量
  • 算法

    • EA=A+(R)
  • 用法

    • 为完成重复操作提供一种高效机制
    • 方便访问线性表
  • 例子

    • capture-2023-02-06-16-59-09.jpg
    • 基质A:数组起始地址
    • 变址寄存器:下标
  • 扩展

    • 结合间接寻址和变址寻址
    • 前变址:EA = (A + (R))
    • 后变址:EA = (A) + (R)

4.6. 栈寻址

4.6.1. 栈(stack)

  • 有序数组,一次仅能存取它的一个元素

    • 栈顶(top):存取元素的点
      • 栈的元素只能由栈顶添加或删除(后进先出)
    • 栈底(base):栈中最后一个元素
  • 栈操作

    • 86_VoIPSCreencastCoverWnd.png
  • 栈的实现

    • 栈基(base):保存为栈保留的内存 块底部位置的地址
    • 栈限(limit):保存为栈保留的内存块 另一端的地址
    • 栈指针(pointer):保存栈顶的地址
    • 向上/向下增长:向着地址增大/减小的 方向增长
    • 87_VoIPSCreencastCoverWnd.png
  • 栈的应用

    • 后缀(postfix)/ 逆波兰(reverse polish)表示 • 无论表达式多么复杂,后缀表示都不需要括号

4.6.2. 栈寻址

  • 方式
    • 栈指针保存在寄存器中,对寄存器中栈位置的访问实际上是一种寄存器间接寻址方式
  • 解释
    • 与栈相关的是一个指针,它的值是栈顶地址,或者当栈顶的两个元素已在CPU寄存器内,此时栈顶指针指向栈顶的第三个元素
  • 88_VoIPSCreencastCoverWnd.png

5. 指令格式

指令格式

  • 一共操作码,以及隐式或显式的、零个或多个操作数
  • 通过它的各个构成部分来定义指令的位安排
  • 显式或隐式地为每个操作数指定其寻址方式
  • 大多数指令集使用不止一种指令格式

5.1. 设计原则

  • 指令尽量短
    • 程序占用存储存储空间小
  • 有足够的操作码位数
    • 要为操作类型不断增加预留
  • 操作码的编码必须有唯一的解释
    • 操作码译码时要么是唯一的合法编码,要么是不合法的
  • 指令长度是字节的整数倍
    • 与内存按照字节寻址相对应,便于指令的读取和地址计算
  • 合理选择地址字段的个数
    • 涉及到指令长度和规整性,是空间和时间开销权衡的结果
  • 指令尽量规整
    • 简化硬件的实现

5.2. 指令长度

  • 最明显的权衡考虑是在强有力的指令清单和节省空间之间进行
    • 编程人员希望更多的操作码、更多的操作数、更多的寻址方式和更 大的地址范围
    • 指令长度变短可以节省存储空间和减少数据传送时间
  • 指令长度应该是字符长度或定点数长度的整数倍
  • 指令长度应该等于存储器的传送长度(即数据总线宽度),或者 这两个值其中之一是另一个的整数

5.3. 位的分配

给定的指令长度,在操作码数目和寻址能力之间存在着权衡考虑

  • 使用变长的操作码
    • 使用一个最小操作码长度,但是对于某些操作码,可通过使用指令附加位的方法来指定附加的操作
  • 使用寻址位的考虑因素
    • 寻址方式的种数
    • 操作数的数量
    • 寄存器与存储器比较:能用于操作数引用的寄存器越多,指令需要的位数越少
    • 寄存器组的数目:对于固定数目的寄存器, 功能上的分开将使指令只需 较少的位数
    • 地址范围
    • 寻址粒度:使用较大的字时,需要的地址位更少

5.4. 变长指令

取至少等于最长指令长度的几个字节或几个字

  • 优点
    • 易于提供大的操作码清单,而操作码具有不同的长度
    • 寻址方式能更灵活,指令格式能将各种寄存器和存储器引用加上寻 址方式予以组合
  • 缺点
    • 增加CPU的复杂度

5.5. 指令集设计

  • 设计的基本原则
    • 完备性/完整性:操作类型应当尽可能完备,但太复杂了也会给硬 件实现增加困难
    • 兼容性:应当兼容以前的指令系统,为软件重复利用带来方便
    • 均匀性:应当能对多种类型的数据进行处理
    • 可扩充性:操作码要预留一定的编码空间
  • 设计的基本问题
    • 操作指令表:应提供多少和什么样的操作,操作有多复杂
    • 数据类型:对哪几种数据类型完成操作
    • 指令格式:指令的位长度、地址数目、各个字段的大小等
    • 寄存器:能被指令访问的寄存器数目以及它们的用途
    • 寻址:寻址方式的种类以及有效地址的计算
    • 下一条指令地址的确定:通常通过PC寄存器实现
  • 标题: 13_指令系统
  • 作者: Charlie
  • 创建于 : 2023-02-06 11:23:00
  • 更新于 : 2024-07-05 12:55:04
  • 链接: https://chillcharlie357.github.io/posts/8793ab50/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论