指令格式

一条指令由操作码和地址码组成,其中地址码可能有 0~4 个

按地址码数目分类

  • 零地址指令image.png
    • 不需要地址码,如空操作、停机、关中断等指令
  • 一地址指令image.png
    • 只需要单操作数,如加 1、减 1、取反、求补等
      • 指令含义:OP(A1)→A1,完成一条指令需要 3 次访存:取指→读 A1→写 A1
    • 需要两个操作数,但其中一个操作数隐含在某个寄存器 (如隐含在 ACC)
      • 指令含义:(ACC)OP(A1)→ACC,完成一条指令需要 2 次访存:取指→读 A1
    • 注:A1 指某个主存地址,(A1) 表示 A1 所指向的地址中的内容
  • 二地址指令image.png
    • 常用于需要两个操作数的算术运算、逻辑运算相关指令
      • 指令含义:(A1)OP(A2)→A1,完成一条指令需要访存 4 次,取指→读 A1→读 A2→写 A1
  • 三地址指令image.png
    • 常用于需要两个操作数的算术运算、逻辑运算相关指令
      • 指令含义:(A1)OP(A2)→A3,完成一条指令需要访存 4 次,取指→读 A1→读 A2→写 A3
  • 四地址指令image.png

    • 常用于需要两个操作数的算术运算、逻辑运算相关指令
      • 指令含义:(A1)OP(A2)→A3,A4 = 下一条将要执行指令的地址,完成一条指令需要访存 4 次,取指→读 A1→读 A2→写 A3
    • 正常情况下:取指令之后 PC+1,指向下一条指令;四地址指令:执行指令后,将 PC 的值修改为 A4 所指地址

      按指令长度分类

  • 定长指令字结构:指令系统中所有指令的长度都相等

  • 变长指令字结构:指令系统中各种指令的长度不等

指令字长:一条指令的总长度 (可能会变)
机器字长:CPU 进行一次整数运算所能处理的二进制数据的位数 (通常和 ALU 直接相关)
存储字长:一次存储单元中的二进制代码位数 (通常和 MDR 位数相同)
半字长 / 单字长 / 双字长指令:指令长度是机器字长的多少倍
指令字长会影响取指所需时间 (访存)

按操作码长度分类

  • 定长操作码:指令系统中所有指令的操作码长度都相同
  • 可变长操作码:指令系统中各指令的操作码长度可变

    按操作类型分类

  • 数据传送类:进行主存与 CPU 之间的数据传送

    • LOAD:将存储器中的数据放到寄存器中
    • STORE:将寄存器中的数据放到存储器中
  • 运算类
  • 程序控制类:改变程序执行的顺序
  • 输入输出类:进行 CPU 与 I/O 设备之间的数据传送

    扩展操作码指令格式

    定长指令字结构+可变长操作码→扩展操作码指令格式
    扩展操作码指令格式:不同地址数的指令使用不同长度的操作码

  • 不允许短码是长码的前缀。即短操作码不能与长操作码的前面部分的代码相同

  • 各指令的操作码一定不能重复

image.png

指令寻址

  • 指令寻址:确定下一条要执行的指令的存放地址。由程序计数器 PC 指明。
  • 顺序寻址:(PC)+”1”→PC
    • 此处的 “1” 理解为 1 个指令字长
    • 每次取指结束后,一定会 PC+”1”
  • 跳跃寻址:执行转移类指令导致的 PC 值改变 (JMP、CALL)

注:每一条指令的执行都分为”取指令 “、” 执行指令“两个阶段

数据寻址

  • 数据寻址:确定本条指令的地址码指明的真实地址

image.png
操作数的真实 (有效) 地址:EA
表中访存次数不包括取指
立即数寻址中地址码为补码,EA = 当前指令所在地址
隐含寻址:操作数地址不是显式地给出,如单地址指令中一个操作数在 ACC 累加寄存器中
偏移寻址包括:基址寻址、变址寻址、相对寻址。区别在于偏移的” 起点 “不同。

  • 基址寻址:以程序的起始存放地址作为” 起点 “。基址寄存器中存放程序起始存放地址,偏移量是指令中的形式地址。优点:便于实现多道程序并发运行,可用于编制浮动程序 (整个程序在内存中浮动)。
  • 变址寻址:程序员自己决定从哪里作为 “起点”。变址寄存器内容可由用户改变,偏移量是变址寄存器。通过不断改变 IX 的内容,形成数组中任一数据的地址,适合编制循环程序。
  • 相对寻址:以程序计数器 PC 所指地址作为” 起点 “。A 是相对于下一条指令地址的偏移量,可正可负,补码表示。应用于转移指令,便于程序浮动 (一段代码在程序中浮动)。

数的比较:PSW 标志寄存器,有几个比特位记录相减后的运算结果。
image.png
硬堆栈:寄存器;软堆栈:主存中一块区域

CISC 和 RISC

CISC:Complex Instruction Set Computer
设计思路:一条指令完成一个复杂的基本功能
代表:X86 架构,主要用于笔记本、台式机等
RISC:Reduced Instruction Set Computer
设计思路:一条指令完成一个基本” 动作 “,多条指令组合完成一个复杂的基本功能
代表:ARM 架构,主要用于手机、平板
80-20 规律:典型程序中 80% 的语句仅仅使用处理机中 20% 的指令
image.png

习题

  1. 设某台计算机有 100 条指令,要求:
    (1) 采用固定长度操作码编码,试设计其操作码编码。
    (2) 假设这 100 条指令中有 10 条指令的使用概率达到 90%,其余 90 条指令的使用概率达到 10%,试采用不等长编码设计一种操作码编码的方案,并求出操作码的平均长度
    解析:
    (1) 采用固定长度操作码编码,需要 7 位操作码。取其中 100 个代码作为操作码。
    000 0000-110 0011 之间的代码代表 100 条指令。其余的 110 0100-111 1111 共 28 个代码可用于增加新的指令。
    (2)
    采用不固定长度操作码编码,可以用 4 位代码对 10 条指令进行编码,用 8 位代码对 90 条指令进行编码。
    0000~1001 对应 10 条常用的指令;1010~1111 之间的代码扩展 4 位,1010 0000~1111 1001 之间的 90 个代码表示其余 90 条 指令。
    平均长度:4×90%+8×10%=4.4
    2. 设有一台简单计算机的指令系统共有 10 条指令,各指令的使用频率如 下: I1 20%,I2 12%, I3 11%, I4 15%, I5 8%,I6 3%,I7 2%, I8 18%, I9 10%, I10 1%
    (1) 用霍哈夫曼编码设计这 10 条指令的操作码,并计算操作码的平均长度;
    (2) 设计只有两种长度,且平均长度不大于 3.20 位的等长扩展操作码,并计算操作码平均长度
    解析:
    (1)
    Huffman Coding
  • 把出现次数(概率)最小的两个相加,并作为左右子树 (左小右大),重复此过程,直到概率值为 1
  • 将每个二叉树的左边指定为 0,右边指定为 1
  • 沿二叉树顶部到每个字符路径,获得每个符号的编码

按概率从大到小排列:I1 0.2,I8 0.18,I4 0.15,I2 0.12,I3 0.11,I9 0.10,I5 0.08,I6 0.03,I7 0.02,I10 0.01
image.png
平均代码长度:2×0.2+3×0.18+0.15×3+0.12×3+0.11×3+0.1×3+0.08×4+0.03×5+0.02×6+0.01×6=3.03
(2) 一种设计方案是取 3 位和 4 位两种长度,如
000 001 010 011 100 101 1100 1101 1110 1111
平均长度 =3×(0.20+0.18+0.15+0.12+0.11+0.10)+4×(0.08+0.03+0.02+0.01) = 3×0.86 + 4×0.14 = 3.14
另一种方案是取 3 和 5 两种长度,如
000 001 010 011 100 101 110 11100 11101 11110
平均长度 =3×(0.20+0.18+0.15+0.12+0.11+0.10+0.08)+5×(0.03+0.02+0.01) = 3×0.94 + 5×0.06 = 3.12


  1. 某计算机要求如下形式的指令:三地址指令 4 条,单地址指令 254 条,零地址指令 16 条,设指令字长 12 位,每个地址码 3 位,设计其编码。
    解析:
三地址指令 000-011 A1 A2 A3
单地址指令 100 xxxxxxxxx 100 000000-111 111101 A1
零地址指令 11111111 xxxx 11111111 0000-11111111 1111

  1. 计算机指令长度为 20 位,有 2 地址指令,1 地址指令,0 地址指令。地址码长度 6 位,问若操作码字段固定长度为 8 位,现设计出 m 条 2 地址指令,n 条 0 地址指令,此时该计算机最多可以设计出多少条 1 地址指令
    解析:
    操作码字段固定长度为 8 位。最多可以设计出 1 地址指令为 28-m-n 条=256-m-n 条

  1. 计算机指令长度为 16 位,有 2 地址指令,1 地址指令,0 地址指令。地址码长度 6 位,若 m 条 2 地址指令,n 条 0 地址指令,问此时该计算机最多可以设计出多少条 1 地址指令。
    解析:
    先编 2 地址指令,有 24 种状态 ,编完留出 24 - m 种状态;再编 1 地址指令,可扩展出 (24 - m)×26 种状态,编完留出 (24 - m)×26 - x 种状态;最后编 0 地址指令,可扩展出 [(24 - m)×26 - x]×26 种状态 = n;所以 1 地址指令条数 x 为 (24 - m)×26 - n/26

image.png
6. 某 16 位计算机指令格式如下所示,其中 OP 为操作码,试分析指令格式的特点。
解析:
(1) 单字长二地址指令。
(2) 操作码字段 OP 为 7 位,操作码字段 OP 可以指定 128 条指令。
(3) 源寄存器和目标寄存器都是通用寄存器(共 16×2 个寄存器 ),所以是 RR 型指令,两个操作数均在寄存器中。
(4) 这种指令结构常用于算术逻辑运算类指令。


image.png
7. 某 16 位机指令格式如下所示,OP 为操作码字段,试分析指令格式特点。
解析:
(1) 双字长二地址指令,用于访问存储器。
(2) 操作码字段 OP 为 6 位,可以指定 64 种操作。
(3) 一个操作数在源寄存器(共 16 个寄存器 ),另一个操作数在存储器中(由变址寄存器和位移量决定)所以是 RS 型指令。


8.image.png
解析:
(1)立即寻址 (2) 相对寻址 (3) 变址寻址 (4) 寄存器间接寻址 (5) 间接寻址 (6) 基址寻址


  1. 一条指令存储在存储器中地址为 300 的地方,其操作数地址字段为 301,地址字段的值为 400,处理器中寄存器 R1 中包含数据 200,在以下指令寻址方式下,求操作数的有效地址
    (1)直接寻址
    (2)立即数寻址
    (3)相对寻址
    (4)寄存器(R1)间接寻址
    (5)以 R1 为变址寄存器的变址寻址
    解析:
    300 中是操作码 301 是地址码说明占两个地址
    300|301|400
    image.png
    R1 200
    (1)EA=400(2)EA=301(3)EA=(PC)+400(4)EA=200(5)EA=600

  1. 假设寄存器 R 中的数值为 1000,地址为 1000 的存储器中存储的数据为 2000,地址 2000 的存储器中存储的数据为 3000,pc 的值为 4000,问在以下寻址方式下访问的指令操作数的值是什么?
    (1) 寄存器寻址 R
    (2) 寄存器间接寻址(R)
    (3) 直接寻址 1000
    (4) 存储器间接寻址(1000)
    (5) 相对寻址 -2000
    (6) 立即数寻址 #2000
    解析:
    1000|2000
    2000|3000
    PC|4000
    R|1000
    (1)1000(2)2000(3)2000(4)3000(5)3000(6)2000

  1. 某机器字长 16 位,主存按字节编址,转移指令采用相对寻址,由两个字节组成,第一字节为操作码字段,第二字节 为相对位移量字段。假定取指令时,每取一个字节 PC 自动加 1。若某转移指令所在主存地址为 2000H,相对位移量字 段的内容为 06H,则该转移指令成功转以后的目标地址是 ()
    A.2006H
    B.2007H
    C.2008H
    D.2009H
    解析:
    转移指令由两个字节组成,每取一个字节 PC 自动加 1,则取一个指令 PC 应该加 2,所以目标地址为主存地址 + 增加量 + 偏移量 = 2000H+02H+06H=2008H
    所以答案为 C

  1. 偏移寻址通过将某个寄存器内容与一个形式地址相加而生成有效地址。下列寻址方式中,不属于偏移寻址方式的是()
    A. 间接寻址
    B. 基址寻址
    C. 相对寻址
    D. 变址寻址
    解析:
    偏移寻址包括:基址寻址、变址寻址、相对寻址。区别在于偏移的” 起点 “不同。
    所以答案为 A

  1. 例:假设变址寄存器的内容为 1000H,指令中的形式地址为 2000H,地址 1000H 的内容为 2000H,地址 2000H 的内容为 3000H,地址 3000H 的内容为 4000H, 则变址寻址方式下访问到的操作数是 ( )
    A.1000H
    B.2000H
    C.3000H
    D.4000H
    解析:
    EA=2000H+1000H=3000H
    操作数值 = 4000H
    所以答案为 D

image.png
14. 某指令格式如下所示。 其中 M 为寻址方式,I 为变址寄存器编号,D 为形式地址。若采用先变址后间址的寻址方式,则操作数的有效地址是 ()
A. I+D
B. (I)+D
C. ((I)+D)
D. ((I))+D
解析:
先变址:EA=(I)+D;后间址:EA=((I)+D)
所以答案为 C


  1. 下列寻址方式中,最适合按下标顺序访问一维数组元素的是 ()
    A. 相对寻址
    B. 寄存器寻址
    C. 直接寻址
    D. 变址寻址
    解析:
  • 基址寻址:以程序的起始存放地址作为” 起点 “。基址寄存器中存放程序起始存放地址,偏移量是指令中的形式地址。优点:便于实现多道程序并发运行,可用于编制浮动程序 (整个程序在内存中浮动)。
  • 变址寻址:程序员自己决定从哪里作为 “起点”。变址寄存器内容可由用户改变,偏移量是变址寄存器。通过不断改变 IX 的内容,形成数组中任一数据的地址,适合编制循环程序。
  • 相对寻址:以程序计数器 PC 所指地址作为” 起点 “。A 是相对于下一条指令地址的偏移量,可正可负,补码表示。应用于转移指令,便于程序浮动 (一段代码在程序中浮动)。

所以答案为 D


image.png
16. 某 16 位机器所使用的指令格式和寻址方式如下所示,该机有两个 20 位基址寄存器,四个 16 位变址寄存器,十六个 16 位通用寄存器,指令汇编格式中的 S(源),D(目标) 都是通用寄存器,M 是主存中的一个单元。 三种指令的操作码分别是 MOV(OP)=(A)H ,STA(OP)=(1B) H ,LDA(OP)=(3C)H。MOV 是传送指令,STA 为写数指令,LDA 为读数指令。
⑴分析三种指令的指令格式与寻址方式特点。
⑵CPU 完成哪一种操作所花时间最短?哪一种操作所花时间最长?第二种指令的执行时间有时会等于第三种指令的执行时间吗?
⑶下列情况下每个十六进制指令字分别代表什么操作?其中如果有编码不正确,如何改正才能成为合法指令?
①(F0F1)H (3CD2)H
②(2856)H
③(6FD6)H
④(1C2)H
解析:
(1)第一种指令是单字长二地址指令,RR 型;第二种指令是双字长二地址指令,RS 型,其中 S 采用基址寻址或变址寻址,R 由源寄存器决定;第三种也是双字二地址指令,RS 型,其中 R 由目标寄存器决定,S 由 20 位地址(直接寻址)决定。
(2)处理器完成第一种指令所花的时间最短,因为是 RR 型指令,不需要访问存储器。第二种指令所花的时间最长,因为是 RS 型指令,需要访问存储器,同时要进行寻址方式的变换运算(基址或变址),这也要时间。第二种指令的执行时间不会等于第三种指令,因为第三种指令虽也访问存储器,但节省了求有效地址运算的时间开销。
(3)MOV(OP)=(A)H=001010
STA(OP)=(1B)H =011011
LDA(OP)=(3C)H=111100
①(F1F1)h(3CD2)h=1111 0000 1111 0001 0011 1100 1101 0010 正确,将主存 (13CD2)H 地址单元的内存取至 15 号寄存器
②(2856)H=0010 1000 0101 0110 正确,单字长指令,将寄存器 6 的内容传送到寄存器 5
③(6FD6)H=0110 1111 1101 0110,操作码不对,应修改为单字长指令 0010 1000 1101 0110(28D6)H
④(1C2)H=0000 0001 1100 0010,操作码不对,应修改为 (28C2)H


image.png
17. 一台处理器具有如下指令格式:
格式表明有 8 个通用寄存器(长度为 16 位),X 指定寻址方式,主存实际容量为 256K 字。
(1)假设不用通用寄存器也能直接访问主存中的每一个单元,并假设操作码域 OP=6 位,请问地址码域应分配多少位?指令字长度应有多少位?
(2)假设 X=11 时,指定的某个通用寄存器用作基址寄存器,请提出一个硬件设计规则,使得被指定的通用寄存器能访问 1M 主存空间中的每一个单元。
解析:
(1) 要能直接访问主存中的每一个单元,主存地址范围 256K=218(一个字就是一个存储单元),地址码域 18 位;指令字长度 6+2+3+3+18=32 位
(2) 此时指定的通用寄存器用作基址寄存器,长度为 16 位,不能覆盖 1M 字空间,可采用通用寄存器左移 4 位,低位补 0,形成 20 位的基地址, 然后与指令字形式地址相加得到有效地址,可以访问 1M 字空间的任意一 个单元。


image.png
18. 某机的 16 位单字长访内存指令格式如下:
其中,A 为形式地址,补码表示(其中一位为符号位):
I 为直接 / 间接寻址方式:I=1 为间接寻址,I=0为直接寻址方式;
M为寻址模式:0为绝对地址,1为基地址寻址,2为相对寻址,3为立即寻址;
X 为变址寻址。
设PC,Rx,Rb 分别为指令计数器,变址寄存器,基地址寄存器,E为有效地址,请回答以下问题:
(1)该指令格式能定义多少种不同的操作?立即寻址操作数的范围是多少?
(2)在非间接寻址情况下,写出各计算有效地址的表达式
(3)设基址寄存器为 14 位,在非变址直接基地址寻址时,确定存储器可寻址的地址范围
(4)间接寻址时,寻址范围是多少?
解析:
(1) 操作码 4 位,16 种不同的操作;形式地址 8 位 (1 位为符号位),立即寻址操作数范围 - 128~+127
(2)绝对 (直接) 寻址 E=A;基地址寻址 E=Rb+A;相对寻址 E=PC+A;立即寻址 D=A;变址寻址 E=Rx+A
(3) 直接基地址寻址 E=Rb+A,14 位,214=16K,可寻址的地址范围 0-16K-1
(4) 间接寻址 E=(A),16 位,寻址范围 64K


image.pngimage.png
19. 某计算机字长为 16 位,主存地址空间大小为 128KB, 按字编址。采用单字长指令格式,指令各字段定义如下
转移指令采用相对寻址,相对偏移是用补码表示,寻址方式定义如下:
注:(X) 表示有存储地址 X 或寄存器 X 的内容,请回答下列问题:
(1)该指令系统最多可有多少指令?该计算机最多有多少个通用寄存器?存储地址的寄存器 (MAR) 和存储数据的寄存器 (MDR)至少各需多少位?
(2) 转移指令的目标地址范围是多少?
(3) 若操作码 0010B 表示加法操作 (助记符为 add),寄存器 R4 和 R5 得编号分别为 100B 何 101B,R4 的内容为 1234H,R5 的 内容为 5678H,地址 1234H 中的内容为 5678H,5678H 中的内容为 1234H,则汇编语言为
add (R4),(R5) +
(逗号前为源操作符,逗号后目的操作数)
对应的机器码是什么 (用十六进制)?该指令执行后,哪些寄存器和存储单元的内容会改变?改变后的内容是什么?
解析:
(1)OP4 位,最多 16 条指令;Rs/Rd3 位,最多 8 个通用寄存器;某计算机字长为 16 位,主存地址空间大小为 128KB, 按字编址,MAR16 位;MDR16 位
(2) 主存地址,转移指令的目标地址 16 位,范围 0~216-1
(3) 机器码:0010 001 100 010 101=0010 0011 0001 0101=2315H
该指令的功能是将 R4 中所指地址中数据 (源) 与 R5 中所指地址中数据 (目标) 的内容相加后,写到 R5 中地址所指的存储单元
(R5)、((R5)) 会改变;((R5))=5678H+1234H=63ACH,(R5)=5678H+1=5679H