Skip to content

(一)指令的设计

1. 指令的基本格式

1.1. 概念

  • 指令:一串有特定含义的二进制数
  • 程序:程序本质是是一系列按顺序排列的指令;

1.2. 基本格式

  • 一条指令一般包含如下部分
    • 操作码;
    • 操作数地址;
    • 存放操作结果的地址;
    • 下一条指令的地址;
  • 基本指令格式:操作码 + 地址码
    • 操作码:表示该指令要完成的操作;
    • 地址码:表示操作对象的地址;
    • 指令长度(也称指令字长)取决于:操作码长度、操作数地址长度、操作数地址个数;
  • 地址码个数分类法:零地址指令、一地址指令、……;根据地址码的个数来分类;
    • 零地址指令:如开关机,重启指令;
    • 一地址指令:如取栈顶,取次栈顶数,隐含寻址(另一地址存放在固定寄存器中);
    • 二地址指令:一般的二元运算,如加减乘除;
    • 三地址指令:一般是二元运算 + 指定存放结果的寄存器地址;

1.3. 设计指令:定长和不定长操作码

  • 定长操作码:操作码位数固定(如 4 位);

    • 优点:设计简单;
    • 缺点:可设计的指令个数较少(2n);
  • 不定长操作码:在特定情况下,部分地址码可作为操作码来识别指令;

    • 实例分析:指令字长 16 位,4 位一组。前 4 位操作码,后 12 位为 3 组地址码 A1A3;

    • 方法一:每组码(除最后一组)为全 1 时,表示后面一组也作为操作码,即操作码扩展 4 位

      类型个数操作码范围
      三地址码150000 ~ 1110
      二地址码151111 0000 ~ 11111 1110
      一地址码151111 1111 0000 ~ 1111 1111 1110
      零地址码161111 1111 1111 0000 ~ 1111 1111 1111 1111
    • 方法二:要求有 14 条二地址码和 31 条一地址码,其他和方法一相同;

      • 解:将二地址码的 1111 11110 给一地址码用,即 1111 1110 0000 到 1111 1111 1110 都是一地址码即可;
      • 结论:地址码较多的指令放出一条,可以使得地址码较少的指令就可以增加 2NN 是空出的地址码位数;

习题

    1. 零地址指令中,操作数的地址来自()
    • A. 立即数和栈顶;
    • B. 暂存器;
    • C. 栈顶和次栈顶;
    • D. 内存;
    • 答案:C
    • 解析:(记)零地址指令中:
      • 若有 1 个操作数:则来自栈顶;
      • 若有 2 个操作数:则来自栈顶和次栈顶;
      • 若有运算结果,结果自动压回栈顶
    1. 指令字长 16 位,地址码 6 位,指令类型有零地址、一地址、二地址。
    • (1) 定长操作码,设一地址有 P 个,二地址 Q 个,则零地址指令有多少个?
    • (2) 扩展操作码,零地址指令 Y 种,二地址指令 X 种,则一地址指令最多有多少种?
      • 答案:1)16PQ 个,2)64×(16X)Y/64
    • 解析:首先计算出操作码位数 nop=166×2=4
      • 1)定长操作码,所有指令最多有 2nop=16 种,减去给出的即可,即 16PQ
      • 2)这题要注意各类地址互相决定的顺序:先定二地址 > 再定一地址 > 再定零地址;
        • 二地址指令最多是 2nop=16 种,现用了 X 种,则还有 16X 种没用。
        • 若将这些二地址指令都给一地址用,则因为多出的地址位,1 种二地址指令可对应 26=64 种,故一地址总共是 Z=64×(16X)注意上述 16X 包含了本身就是用来扩展一地址的全 1 情况
        • 因为还有 Y 种是零地址,都是根据没用的一地址扩展而来,一个一地址可以扩展 26=64 个零地址,故用来扩展的一地址指令种数为 W=Y/64
        • 所以,可用的一地址种数最多为 S=ZW=64×(16X)Y/64
    1. 按字节编址,指令字长固定且只有两种格式,三地址指令 29 条,二地址指令 107 条,地址码 6 位,则指令字长至少为
    • A. 24;
    • B. 26;
    • C. 28;
    • D. 32;
    • 答案:A;
    • 解析:按照第 2 题的决定顺序,反过来就应该先考虑二地址,再考虑三地址。设操作码位数 x
      • 二地址 107 条,是由缺省的三地址扩展而来,因此需要缺省的三地址条数 n=107/26=2
      • 三地址 29 条,加上缺省的 2 条共 31 条,全部由操作码表示,因此有 2x31,得 xmin=5
      • 所以指令字长最少 5+3×6=23
      • 因为 "按字节编址",即一次性存取 8 位,则各种码的长度都应取 8 的整数倍,以方便寻址和存取,故选最接近的 24;