第七章 指令系统
7.1 机器指令
7.1.1 指令的一般格式
1. 操作码
操作码用来指明该指令所要完成的操作。操作码分为长度固定和长度可变两种。
① 对于长度固定的操作码,无论地址码字段有多长,能容纳有几个操作数,操作码的长度都不变,所能容纳的操作的数量也不变;
② 对于长度可变的操作码,随着操作数个数的减少,地址码字段的长度也会减少,进而操作码的长度就会增加,所能容纳的操作的数量也会增加。
扩展操作码技术:
三地址指令操作码每减少一种,最多可多构成 2
4
^4
4 种二地址指令;二地址指令操作码每减少一种,最多可多构成 2
4
^4
4 种一地址指令。
2. 地址码
地址码用来指出该指令的源操作数的地址、结果的地址、下一条指令的地址。这里的 “地址” 可以是主存的地址,也可以是寄存器的地址,甚至可以是 I/O 设备的地址。
地址码可以根据地址字段的个数进行分类,在以下分析中,假设指令字长为 32 位
操作码固定为 8 位。
(1) 四地址指令
其中OP为操作码,A
1
_1
1 是第一操作数地址,A
2
_2
2 是第二操作数地址,A
3
_3
3 是结果的地址,A
4
_4
4 是下一条指令地址。
该指令完成 (A
1
_1
1) OP (A
2
_2
2) → A
3
_3
3 的操作,每一个操作数的地址占 6 位,其寻址范围为 2
6
^6
6 = 64;这种指令执行期间会访存 4 次 (取指令一次,取两个操作数两次,存放结果一次)。
程序计数器 PC 既能存放当前欲执行的指令的地址,又具有计数功能,能自动形成下一条指令的地址,因此可以用 PC 代替 A
4
_4
4,由四个操作数变为三个操作数,从而每个操作数所占的地址位数也会增加。
(2) 三地址指令
该指令完成 (A
1
_1
1) OP (A
2
_2
2) → A
3
_3
3 的操作,每一个操作数的地址占 8 位,其寻址范围为 2
8
^8
8 = 128;这种指令执行期间依旧会访存 4 次。
指令执行时,没有必要将每次的结果都放入主存,也可以暂时存放在寄存器 (如ACC) 中,这样有可以省去一个地址字段 A
3
_3
3,由三个操作数变为两个操作数。
(3) 二地址指令
该指令完成 (A
1
_1
1) OP (A
2
_2
2) → A
1
_1
1 或 (A
1
_1
1) OP (A
2
_2
2) → A
2
_2
2 的操作,每一个操作数的地址占 12 位,其寻址范围为 2
1
2
^12
12 = 4K。
如果把结果放入主存,那么这种指令执行期间依旧会访存 4 次,如果把结果暂时存放在寄存器 (如ACC) 中,那么这种指令执行期间会访存 3 次。
如果将一个操作数隐含在运算器的 ACC 中,那么又可以省去一个操作数。
(4) 一地址指令
该指令完成 (ACC) OP (A
1
_1
1) ACC 的操作,每一个操作数的地址占 12 位,其寻址范围为 2
2
4
^24
24 = 16M;这种指令执行期间会访存 2 次。
(5) 零地址指令
有一些操作不需要地址码,如空操作、停机;有些指令的操作数的地址隐含在堆栈指针 SP 中。这些指令都是零地址指令。
当用一些硬件资源代替指令字中的地址码字段后:
✦ 可扩大指令的寻址范围
✦ 可缩短指令字长
✦ 可减少访存次数
当指令的地址字段为寄存器时:
✦ 可缩短指令字长
✦ 指令执行阶段不访存
7.1.2 指令字长
指令字长决定于:
✦ 操作码的长度
✦ 操作数地址的长度
✦ 操作数地址的个数
指令字长固定的情况下,指令字长 = 存储字长;
指令字长可变的情况下,指令字长按字节的倍数变化,即 1 个字 = 1、2、3 字节或… = 8、16、24位…
7.2 操作数类型和操作类型
7.2.1 操作数类型
✦ 地址:在进行地址计算时,可以把地址看作是一种无符号整数。
✦ 数字:常见的数字有定点数、浮点数、十进制数等。
✦ 字符:普遍采用 ASCII 码表示。
✦ 逻辑数:可以参与逻辑运算。
7.2.2 数据在存储器中的存放方式
1. 边界对准与否
(1) 边界对准
(2) 边界未对准
该存放方式对于字长较长的数据进行存取时,需要读取两次存储器,而后还需要对高低字节的位置进行调整,才能求得相应的数据,如下图的阴影部分的数据。
2. 字节次序
7.2.3 操作类型
1. 数据传送
2. 算术逻辑操作
算术运算:加、减、乘、除、增 1、减 1、求补、浮点运算、十进制运算;
逻辑运算:与、或、非、异或、位操作、位测试、位清除、位求反。
3. 移位操作
包括算术移位、逻辑移位、循环移位。
4. 转移
(1) 无条件转移
例如 JMP X,其功能为将指令地址无条件转至X。
(2) 条件转移
根据当前指令的执行结果来决定是否转移,条件满足则转移,条件不满足则继续顺序执行。
例如,结果为零转指令 (Z = 1) :JZ;结果溢出转指令 (O = 1) :JO;结果有进位转指令 (C = 1) :JC。
还有一种条件转移指令 SKP,它暗示跳过下一条指令。例如下图的例子中,如果条件满足 (即完成触发器 D 为 0),则执行完第 305 条指令后,立即跳至第 207 条指令,再顺序执行。
(3) 调用和返回
✦ 子程序可在多处被调用;
✦ 子程序调用可以出现在子程序中,即允许子程序嵌套;
✦ 每个 CALL 指令都对应一条 RETURN 指令。
(4) 陷阱 (Trap) 与陷阱指令
陷阱就是一种意外事故的中断,例如电源电压不稳、输入输出设备故障、除数为0等情况。
计算机的陷阱指令一般不提供给用户直接使用,而作为隐指令 (即指令系统中不提供的指令),在出现事故时,由 CPU 自动产生并执行。
有的机器也设置供用户使用的陷阱指令,这种陷阱指令可以用来完成系统调用。
5. 输入输出
对于 I/O 单独编址的计算机而言,通常设有输入输出指令,它完成从外设的寄存器读入一个数据到 CPU 的寄存器中,或将数据从 CPU 的寄存器输出到某个外设的寄存器中。
7.3 寻址方式
寻址方式即,确定本条指令的操作数地址和下一条欲执行指令的指令地址的方法。寻址方式分为指令寻址和数据寻址两大类。
7.3.1 指令寻址
指令寻址分为顺序寻址和跳跃寻址:
✦ 顺序寻址由 PC 完成,自动形成下一条指令的地址;
✦ 跳跃寻址由转移类指令完成。
7.3.2 数据寻址
数据寻址方式种类较多,在指令字中必须设一字段来指明属于哪一种寻址方式。指令的地址码字段通常都不代表操作数的真实地址,故把它称为形式地址,记作 A。操作数的真实地址称为有效地址,记作EA,它是由寻址方式和形式地址共同来确定的。由此可得指令的格式应如下图所示。
为了便于分析研究各类寻址方式,假设指令字长、存储字长、机器字长均相同。
1. 立即寻址
形式地址 A 不是操作数的地址,而是操作数本身。
✦ 立即数用补码形式存放;
✦ 指令执行阶段不访存;
✦ A 的位数限制了立即数的范围。
2. 直接寻址
形式地址 A 就是操作数的真实地址 EA。
✦ 执行阶段访问一次存储器;
✦ A 的位数决定了该指令操作数的寻址范围;
✦ 操作数的地址不易修改 (必须修改 A 才能修改操作数) 。
3. 隐含寻址
指令字中不明显给地给出操作数的地址,其操作数的地址隐含在操作码或某个寄存器中。
如 Intel 8086 中的乘法指令 MUL,被乘数隐含在 AX (16位) 或 AL (8位) 中。又如字符串传送指令 MOVS,源操作数的地址隐含在寄存器 SI 中,目的操作数的地址隐含在寄存器 DI 中。
✦ 指令字中少了一个地址字段,可缩短指令字长。
4. 间接寻址
有效地址由形式地址间接提供,即 EA = (A) 。
多次间址中,可用存储字的首位标记间址是否结束。
由于 A 的位数小于指令字长,而指令字长与存储字长相同,即若 A 为 8 位,存储字长为 16 位,则直接寻址范围为 2
8
^8
8,一次间接寻址的寻址范围为 2
16
^{16}
16。
在子程序返回时,例如下图,只要在调用前先将返回地址存入子程序最末条指令的形式地址 A 的存储单元中,便可准确返回到源程序断点。例如,第一次调用子程序时,[A] = 81,第二次调用子程序时,[A] = 202。
✦ 执行指令阶段 2 次访存 (一次间址) 或多次访存 (多次寻址);
✦ 可扩大寻址范围;
✦ 便于编制程序,很方便地完成子程序返回。
5. 寄存器寻址
形式地址部分直接指出寄存器号,即 EA = R
i
_i
i,寄存器中存放着操作数。
✦ 执行阶段不访存,只访问寄存器,执行速度快;
✦ 寄存器个数有限,可缩短指令字长。
6. 寄存器间接寻址
形式地址部分直接指出寄存器号,但寄存器中存放着操作数所在的主存单元的地址号,即 EA = (R
i
_i
i)。
✦ 有效地址在寄存器中, 操作数在存储器中,执行阶段访存比间接寻址少 1 次;
✦ 便于编制循环程序。
7. 基址寻址
需要一个基址寄存器 BR,有效地址 EA 等于基址寄存器中的地址加上形式地址 A,即 EA = (BR) + A。
(1) 采用专用寄存器作基址寄存器
✦ 可扩大寻址范围;
✦ 在程序的执行过程中 BR 内容不变,形式地址 A 可变;
✦ 有利于多道程序,用户不必知道自己的程序存放在主存的什么位置,只需要操作系统赋予 BR 一个值,就能够完成从程序的逻辑地址到主存的物理地址的转化。
(2) 采用通用寄存器作基址寄存器
✦ 由用户指定哪个通用寄存器作为基址寄存器;
✦ 基址寄存器的内容由操作系统确定;
✦ 在程序的执行过程中 R
0
_0
0 内容不变,形式地址 A 可变。
8. 变址寻址
需要一个基址寄存器 IX,有效地址 EA 等于基址寄存器中的地址加上形式地址 A,即 EA = (IX) + A。
✦ 可扩大寻址范围;
✦ IX 的内容由用户给定;
✦ 在程序的执行过程中 IX 内容可变,形式地址 A 不变 (这也是和基址寻址的不同之处);
✦ 便于处理数组问题。
例:设数据块首地址为 D,求 N 个数的平均值。
9. 相对寻址
有效地址 EA 等于程序计数器 PC 中的地址加上形式地址 A,即 EA = (PC) + A,A 是相对于当前指令的位移量 (可正可负,用补码表示)。
✦ A 的位数决定操作数的寻址范围;
✦ 对程序浮动 (即不知道程序在主存中的位置) 很有利;
✦ 广泛用于转移指令。
例:相对寻址举例
M 随程序所在存储空间的位置不同而不同,而指令 BNE –3 与 指令 ADD X, D 相对位移量不变,指令 BNE –3 操作数的有效地址为EA = ( M+3 ) –3 = M。
例:按字节寻址的相对寻址举例
设当前指令地址 PC = 2000H,转移后的目的地址为 2008H,因为是二字节指令,所以取出 JMP * + 8 后 PC = 2002H,因此 JMP * + 8 指令 的第二字节为 2008H - 2002H = 06H。
10. 堆栈寻址
(1) 堆栈的特点
堆栈既可以用寄存器组实现 (称为硬堆栈),也可以用主存的一部分空间做堆栈 (称为软堆栈)。
下面以先进后出型堆栈 (一个入出口) 为例, 栈顶地址由堆栈指针 SP 指出。
(2) 堆栈寻址举例
(3) SP 的修改与主存编址方法有关
① 按字编址
进栈:(SP) + 1 → SP
出栈:(SP) - 1 → SP
② 按字节编址
存储字长 16 位
进栈:(SP) + 2 → SP
出栈:(SP) - 2 → SP
存储字长 32 位
进栈:(SP) + 2 → SP
出栈:(SP) - 2 → SP
11. 基本寻址方式的算法和优缺点
7.4 指令格式举例
7.4.1 设计指令格式时应考虑的各种因素
1. 指令系统的兼容性
必须考虑新机器的指令系统与同一系列机器指令系统的兼容性,即高档机必须能兼容低档机程序的运行,称之为 “向上兼容”。
2. 其他因素
① 操作类型:包括指令个数及操作的难易程度
② 数据类型:确定哪些数据类型可参与操作
③ 指令格式:指令字长是否固定,操作码位数、是否采用扩展操作码技术,地址码位数、地址个数、寻址方式类型
④ 寻址方式:指令寻址、操作数寻址用什么方式
⑤ 寄存器个数:寄存器的多少直接影响指令的执行时间
3. 指令系统设计原则
① 完备性:指令丰富,功能齐全,使用方便
② 有效性:程序占空间小,执行速度快
③ 规整性:
对称性 (对不同寻址方式的支持)
匀齐性 (对不同数据类型的支持)
一致性 (指令长度和数据长度的一致性)
④ 兼容性:系列机软件向上兼容
难以兼得!
7.4.2 指令格式举例
1. PDP-8
PDP-8 的指令字长统一为 12 位,CPU 内只设一个通用寄存器,即累加器 ACC,其主存被划分为若干个容量相等的存储空间 (每个相同的空间被称为一页)。该机的指令格式可分为三大类,如下图所示。
访存类指令属一地址指令。0~2 位为操作码 (只定义了000-101六种基本操作);3、4两位为寻址特征位,其中3位表示是否间接寻址,4位表示是当前页面 (即PC指示的页面) 还是0页面;5-11位为地址码。
为了扩大操作种类,对应操作码 “111” 又配置了辅助操作码,构成了寄存器类指令,这类指令主要对 ACC 进行各种操作,如清A、对A取反、对A移位、对A加1、根据A的结果是否跳转等。辅助操作码的每一位都有一个明确的操作。
第三类指令是 I/O 类,用 0-2 位为 110 作标志,其具体操作内容由 9-11 位反映,3~8位表示设备号,总共可选64种设备。
PDP-8指令格式支持间接寻址、变址寻址、相对寻址。加上操作码扩展技术,共有35条指令。
2. PDP-11
PDP-11 机器字长为 16 位,CPU内设 8 个 16 位通用寄存器,其中两个通用寄存器有特殊作用,一个用作堆栈指针SP,一个用作程序计数器PC。
PDP-11 指令字长有 16 位、32 位和 48 位三种,采用操作码扩展技术,使操作码位数不固定,指令字的地址格式有零地址、一地址、二地址等共有 13 类指令格式,下图列出了其中五种。
图中 (a) 为零地址格式;(b) 为一地址格式,其中 6 位目的地址码中的 3 位为寻址特征位,另外 3 位表示 8 个寄存器中的任一个;©、(d)、(e) 均为二地址格式指令,但操作数来源不同,有寄存器-寄存器型、寄存器-存储器型和存储器-存储器型。
PDP-11 指令系统和寻址方式比较复杂,既增加了硬件的价格,又增加了编程的复杂度,但好处是能编出非常高效的程序。
3. MIPS指令格式
4. X86指令系统举例
MIPS X86 差异:
7.5 RISC 技术
RISC (Reduced Instruction Set Computer) 精简指令系统计算机
CISC (Complex Instruction Set Computer) 复杂指令系统计算机
7.5.1 RISC 的产生和发展
80-20 规律:典型程序中 80% 的语句仅仅使用处理机中 20% 的指令。
然而执行频度高的简单指令,因复杂指令的存在,执行速度无法提高。
能否用 20% 的简单指令组合不常用的80% 的指令功能?
7.5.2 RISC 的主要特征
✦ 选用使用频度较高的一些 简单指令,复杂指令的功能由简单指令来组合
✦ 指令长度固定、指令格式种类少、寻址方式少
✦ 只有 LOAD / STORE 指令访存
✦ CPU 中有多个通用寄存器
✦ 采用流水技术,一个时钟周期内完成一条指令
✦ 采用组合逻辑实现控制器
✦ 采用优化的编译程序
7.5.3 CISC 的主要特征
✦ 系统指令复杂庞大,各种指令使用频度相差大
✦ 指令长度不固定、指令格式种类多、寻址方式多
✦ 访存指令不受限制
✦ 访存指令不受限制
✦ 大多数指令需要多个时钟周期执行完毕
✦ 采用微程序控制器
✦ 难以用优化编译生成高效的目的代码
7.5.4 RISC和CISC 的比较
1. RISC更能充分利用 VLSI 芯片的面积
2. RISC 更能提高计算机运算速度,指令数、指令格式、寻址方式少,通用寄存器多,采用组合逻辑 ,便于实现指令流水
3. RISC 便于设计,可降低成本,提高可靠性
4. RISC 有利于编译程序代码优化
5. RISC 不易实现指令系统兼容