指令系统


[toc]

一.指令系统的发展与性能要求

一个好的指令系统一般满足以下几个要求:

  1. 完备性
  2. 规整性
  3. 高效率
  4. 兼容性

一条指令一般提供两方面的信息

  1. 指明操作的**性质**及**功能**
  2. 给出与操作数有关的信息,如直接给出操作数本身或是指明操作数的来源,运算结果存放在何处,以及下一条指令从何处取得等。

二.指令格式

操作码字段OP 地址码字段A

2.1 指令字长

在设计指令格式时需要考虑以下一些问题:

  1. 指令字长需要多少位,是定子长还是变字长
  2. 操作码结果需要多少位,位数与位置固定还是可拓展;是一段操作码还是由若干段组成
  3. 地址结构——一条指令的执行涉及那些地址,在指令中给出了哪些地址,哪些地址是隐含约定的
  4. 寻址方式——如何获得操作数地址,是直接给出还是间接给出,还是经过变址计算所得等

机器字长:计算机能直接处理的二进制数据的位数,机器字长一般等于内部寄存器的大小,它决定了计算机的运算精度。

指令字长:一个指令中包含二进制代码的位数。

存储字长:一个存储单元存储二进制代码的长度,必须是字节的整数倍

指令字长的选择

  1. 指令字长尽可能短
  2. 指令字长应等于字节的整数倍,以免浪费存储空间

指令字长一般都取存储字长的整数倍,如果指令字长等于存储字长的2倍,就需要2次访存来取出一条指令,因此取指周期是机器周期的2倍,若指令周期等于存储字长,则取指周期等于机器周期。

2.2 指令的操作码

指令操作码的编码可以分为规整型非规整型

2.2.1 规整型

​ 当指令字长较长时,允许有足够的操作码位数,可以采取定长编码方式。

​ 定长编码对于简化硬件设计,减少指令译码的时间是非常有利的,通常在指令字长较长的大型、中型计算机就及超级小型计算机上广泛采用

2.2.2 非规整型

拓展操作码法:操作码位数不采用单一固定不变的位数,而是随地址码个数的变化而变化,操作码采取可变长度的类型

​ 拓展操作码的注意点

  1. 不允许短码是长码的前缀
  2. 各条指令的操作码一定不能重复雷同
  3. 各类指令的格式安排应统一规整

2.3 地址码的结构

显地址:在指令中明显给出地址,如写明存储单元号或寄存器号

隐地址:以隐含的方式约定,如事先隐含约定操作数在某个寄存器中,或是在堆栈中

  1. 四地址指令

    $(A_1) OP(A_2)\rightarrow A_3 \\ A_4 = 下一条执行指令的地址$

  2. 三地址指令

    $(A_1)OP(A_2)\rightarrow A_3 \\ (PC)+1\rightarrow PC(隐含)$

    执行一条三地址的双操作数运算指令,至少需要访问4次主存储器。第一次取指令本身,第二次取第一操作数,第三次取第二操作数,第四次保存运算结果

  3. 二地址指令

    $(A_1)OP(A_2)\rightarrow A_1 \\ (PC)+1\rightarrow PC(隐含)$

    同样需要至少访问四次主存储器

  4. 一地址指令

    $(AC)OP(A_1)\rightarrow AC \\ (PC)+1\rightarrow PC(隐含)$

    AC为累加寄存器

    执行一条一地址的双操作数运算指令,只需要访问2次主存储器。第一次取指令本身,第二次取第一操作数。第二操作数和运算结果都放在AC中,所以读取和存入都不需要访问主存储器

  5. 零地址指令

    零地址的算数逻辑类指令用在堆栈计算机中的,堆栈计算机没有一般计算机中必备的通用寄存器,因此

  6. 存储器——存储器(SS)型指令

  7. 寄存器——寄存器(RR)型指令
  8. 寄存器——存储器(SR)型指令

通常一个指令系统中指令字的长度指令中的地址结构并不是单一的,往往采用多种格式混合使用,这样可以增强指令的功能

三.寻址技术

3.1 编制方式

编制方式:对各种存储设备进行编码的方法

常用的编制单位:字编址,字节编址,位编址等

3.1.1 字编址

  1. 控制方式实现简单,地址信息,存储容量等没有任何浪费
  2. 缺点是没有对非数值计算提供支持,而非数值计算应用要求按字节编码,因为它的基本寻址单位是字节

3.1.2 字节编址

  1. 最大优点:能使编制单位与信息的基本单位(字节)相一致
  2. 存在着地址信息的浪费

3.2 指令的寻址方式

在存储器中,操作数或指令字写入或读出的方式可分为:地址指定方式相联存储方式堆栈存取方式

寻址方式分为两类:指令寻址方式数据寻址方式

寻找下一条将要执行的指令的地址成为指令寻址,又可以细分为顺序寻址跳跃寻址

顺序寻址方式:通过程序计算器PC加1,自动形成下一条指令的地址

跳跃寻址方式:所谓跳跃指的是下条指令的地址吗不是由程序计数器PC给出,而是由本条指令给出的

3.3 操作数的寻址方式

操作数寻址方式形成操作数的有效地址的方式

有效地址:是操作数在主存的地址寄存器地址,是操作数真正的地址.

形式地址:指令字中给定的地址量。

寻址方式特征位,通常由间址位变址位组成,如果这条指令无间址和变址的要求,那么形式地址就是操作数的有效地址

**寻址过程就是把操作数的形式地址变化为操作数的有效地址的过程**

数据寻址方式

  1. 立即数寻址方式

    指令的地址码字段指出的不是操作数的地址,而是操作数本身

    例如:IF I > 25 THEN J = K + 12,这里常量12和25均由立即数寻址指定

  2. 直接寻址方式

    1. 直接寻址方式: 操作数在主存储器中指令中直接给出操作数所在主存储器单元的有效地址
    2. 寄存器(直接)寻址方式:操作数在指定的寄存器中

    例如:ADD P, Q, R,表示将存储单元Q的内容与R的内容相加,并将结果保存在存储单元P中(ARM中的寻址可能不太一样)

  3. 间接寻址方式

    1. 间址方式:指令中给出的地址是存放操作数地址的主存储器单元的地址可以有多级间址
    2. 寄存器间接寻址方式:地址字段指的是存储位置还是寄存器

    指令地址字段中的形式地址A不是操作数的真正地址,而是操作数地址的指示器

    获得一个操作数需要3次访问:指令,读含有操作数地址的寄存器,以及最后读出实际的操作数

  4. 相对寻址方式

    把程序计数器PC中的内容加上指令格式中的形式地址(偏移量)D形成操作数的有效地址。即是EA=(PC)+D

  5. 基址寻址方式

    同相对地址,不过有效地址EA = [$R_i$]+D,其中Ri是基址寄存器,里面存放的是基准地址,D为指令地址码给出;

    优点:扩大寻址能力,因为基址寄存器的位数可以设置得很长从而在较大得存储空间中寻址

  6. 变址寻址方式

    通过将变址寄存器$R_x$的内容与形式地址相加来形成操作数的有效地址,即EA=($R_x$)+A

    变址寻址和基址寻址的区别:基址寄存器提供的基准值是固定的,指令提供位移量是可变的;而变址寄存器提供的修改量是可变的,指令提供的位移量是固定的

  7. 堆栈寻址

    在软堆栈中,堆栈的长度(堆栈中元素的数目)是可变的

    在一般的计算机中,堆栈从高地址向低地址扩展,即栈底的地址总是大于或等于栈顶的地址(也有反过来的)

    进行入栈操作时:先把堆栈指针SP(栈顶指示针)减量,然后把数据送入SP所指定单元

    进行出栈操作时:先把SP所指的单元(栈顶)的数据取出,然后对SP增量

  8. 隐含寻址方式

    不明显给出操作数的地址,而是在指令中隐含着操作数的地址,例如AC(累加寄存器)

四. 指令类型

4.1 程序控制类指令

  1. 转移指令
    1. 无条件转移指令
    2. 条件转移指令
  2. 转子程序与程序返回指令
    1. 区别:转移指令无须返回,转子程序指令则需返回
    2. 通常用堆栈来保存返回地址
  3. 程序中断指令
    1. 一般作为隐指令

4.2 输入输出类指令

对于统一编址方式的计算机,不需要设置专门的IO指令,用一般的数据传送类指针实现输入和输出

对于采用独立编址的计算机,则需要有专门的IO指令