指令系统

概述

指令是计算机处理的最基本单位,采取多周期实现方案

  • 操作码 + 操作数

  • 取指令,译码/取寄存器,执行/有效地址/完成分支,访问内存,存储结果

指令表示

指令由一个位串来表示

指令格式:对于指令的个要素,这个位串划分成几个字段

  • 大多数指令集使用不止一种指令格式

机器指令符号表示法

  1. 操作码缩写成助记符,比如 ADD、SUB 等

  2. 操作数也可以用符号表示

    • 寄存器编号或内存地址

操作码

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

操作数

常见类型:地址、数值、字符、逻辑数据

地址

一个指令需要有4个地址引用:2个源操作数,1个目的操作数、1个下一指令地址

  • 下一指令地址是隐含

每条指令中的地址数目越少,指令的长度越短,不需要复杂的CPU,但是程序总的指令条数更多,执行时间更长,程序更长更复杂

数值

计算机存储的数值是受限的

字符

国际参考字母表IRA / 美国信息交换标准码ASCII:每个字符被表示为唯一的7位二进制串

扩展的二进制编码的十进制交换码EBCDIC:8位编码

统一码Unicode:16位/32位

逻辑数据

将一个n位单元看成是由n个1位项组成,每一项有值0或1

大端序和小端序

大端序:把数据高位放在低地址

小端序:把数据低位放在低地址

  • 两种策略中每个数据项有同样地址

  • 端序不影响结构中的数据项的次序

操作数的引用

寻址方式立即寻址、直接寻址、简介寻址、寄存器寻址、寄存器间接寻址、偏移寻址、栈寻址

记号

  • A:指令中地址字段的内容

  • R:指向寄存器的指令地址字段的内容

  • EA:被访问位置的实际地址

  • (X):存储器位置X或寄存器X的内容

立即寻址

操作数实际出现在指令中

  • 除了取指令之外,获取操作数不要求另外的存储器访问

  • 数的大小受限于地址字段的长度

直接寻址

地址字段含有操作数的有效地址

  • 只要求1次存储器访问,且无需为生成地址而专门计算

  • 地址空间有限

间接寻址

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

  • 第一层地址指向第二层的实际地址

  • 扩大了地址空间

  • 取操作数需要2次访问存储器

寄存器寻址

地址字段指示的是寄存器

  • 寄存器存的是操作数

  • 指令中仅需要一个较小的地址字段,而不需要存储器访问

  • 地址空间十分有限

寄存器间接寻址

地址字段指示寄存器

  • 寄存器存的是操作数地址

  • 扩大地址空间,比间接寻址少1次存储器访问

  • 相对于寄存器寻址,需要多1次存储器访问

偏移寻址

结合直接寻址和寄存器间接寻址能力

  • 实际地址:寄存器存放的地址 + 直接指示的地址

相对寻址

隐含引用的寄存器是程序计数器(PC)

  • 实际地址:下一条指令的地址 +直接指示的地址

基址寄存器寻址

引用的寄存器含有一个存储器地址,地址字段含有偏移量(通常是无符号整数)

  • 实际地址:寄存器存放的地址 + 直接指示的偏移量

  • 寄存器引用可以是显式的,也可以是隐式的

变址寻址

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

  • 实际地址:直接指示的地址 + 寄存器存放的偏移量

栈寻址

栈指针保存在寄存器中,对寄存器中栈位置的访问实际上是一种寄存器间接寻址方式

  • 与栈相关的是一个指针,它的值是栈顶地址,或者当栈顶的两个元素已在CPU寄存器内,此时栈顶指针指向栈顶的第三个元素

指令格式

指令格式通过它的各个构成部分来定义指令的位安排

  • 一个指令格式必须包含一个操作码,以及显式或隐式的、零个或多个操作数

  • 必须显式或隐式地为每个操作数指定其寻址方式

大多数指令集使用不止一种指令格式

设计原则

  1. 指令尽量短

    • 占用存储空间小
  2. 有足够的操作码位数

    • 要为操作类型不断增加预留
  3. 操作码地编码必须有唯一的解释

  4. 指令长度是字节地整数倍

    • 内存是按字节寻址
  5. 合理选择地址字段的个数

  6. 指令尽量规整

指令长度

指令长度应该是字符长度或定点数长度的整数倍

指令长度应该等于存储器的传送长度(数据总线宽度)

  • 或者这两个值其中之一是另一个的整数倍

最明显的权衡考虑是在强有力的指令清单和节省空间之间进行

  • 编程人员希望更多的操作码、更多的操作数、更多的寻址方式和更大的地址范围

  • 指令长度变短可以节省存储空间和减少数据传送时间

位的分配

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

  1. 使用变长的操作码

    • 使用一个最小操作码长度,但是对于某些操作码,可以使用指令附加位的方式来指定附加的操作
  2. 使用寻址位的考虑因素

    • 寻址方式的种数、操作数的数量、寄存器与存储器比较、寄存器组的数目、地址范围、寻址粒度

      • 能用于操作数引用的寄存器越多,指令需要的位数越少

      • 对于固定数目的寄存器,功能上的分开将是指令只需较少的位数

      • 使用较大的字时,需要的地址位更少

变长指令

提供不同长度的各种指令格式

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

优点:

  • 易于提供大的操作码清单,而操作码具有不同的长度

  • 寻址方式能更灵活,指令格式能将各种寄存器和存储器引用加上寻址方式予以组合

缺点:

  • 增加了CPU的复杂程度

指令集设计

指令集定义了处理器应完成的多数功能,对处理器的实现有着显著的影响,是程序员控制处理器的方式,设计时必须考虑程序员的要求

设计基本原则:

  • 完备性/完整性

    • 操作类型应当尽可能完备,但是太复杂也会给硬件实现增加困难
  • 兼容性

    • 应当兼容以前的指令系统,为软件重复利用带来方便
  • 均匀性

    • 应当能对多种类型的数据进行处理
  • 可扩充性

    • 操作码要预留一定的编码空间

设计的基本问题:

  • 操作指令表

  • 数据类型

  • 指令格式

  • 寄存器

  • 寻址方式

  • 下一条指令地址的确定

指令周期

简单指令周期

当且仅有当机器关闭,不可被恢复的错误发生或者程序指令停止了计算机时,程序执行才会停止,不然操作系统的执行是不会停止的

指令周期:处理单个指令的过程

  1. 取指周期:从内存中获取指令

  2. 执行周期:执行所提取的指令

指令执行过程- 掘金

指令周期状态图

  1. 从内存中取指令

  2. 解析指令获取操作码

  3. 获取操作数

含有中断的指令周期

  1. 开中断时响应中断(Interupt enable)

    • 每执行完成一次指令后要check有无中断并且进行处理
  2. 关中断的时候不响应中断

指令周期状态图

间址周期

指令的执行可能涉及一个或多个存储器中的操作数,它们都要求一次存储器访问

  • 使用间接寻址,还需要额外的存储器访问

间址周期:把简介地址的读取看成是一个额外的指令子周期

计算机组成原理