指令系统——第七章(部分)
一、机器指令
- 机器指令:机器语言的语句称为机器指令。
- 指令系统:全部机器指令的集合称为机器的指令系统。机器的指令系统集中反映了机器的功能
1. 指令的一般格式
机器指令一般包括操作码和地址码两部分,如图:
1. 操作码解析
- 作用:指明该指令所要执行的操作,可能还要指出操作数的类型、寻址方式等
- 长度:操作码的长度可能是固定的,也可能是可变的
- 长度固定:用于指令字长较长的情况,如IBM370
- 长度可变:操作码分散在指令字的不同字段中
扩展操作码技术
为什么要使用扩展操作码技术?
在指令字长确定的情况下,使用扩展操作码技术可以有效扩大指令数。这一点之后的讲解中会体现出来
扩展操作码技术有哪些?
扩展操作码技术有两种:
- 保留某一位作为扩展标志进行扩展
- 保留码点作为扩展标志进行扩展
这里介绍第二种。
保留码点作为扩展标志进行扩展
如图,假设一条指令包含了1个操作码和3个地址码,指令字长为16位,操作码占4位。如图:
其所能产生的指令如下:
需要注意:
- 三地址指令:地址码有三个 A 1 、 A 2 、 A 3 A_1、A_2、A_3 A1、A2、A3
- 4位操作码能够生成的指令原本应该是16条,但这里仅使用了15条。原因就在于:保留了操作码1111作为扩展标志,假如OP使用的是1111,就代表占用了地址码 A 1 A_1 A1进行扩展操作码,操作码就成为8位,如下图所示:
- 这里同样保留了操作码1111 1111作为扩展标志,代表该指令系统仍能进行扩展。最终的扩展如下:
这里需要注意到:
- 4位操作码指令原本仅能表示16条指令,但使用了扩展操作码技术后,能够表示61条指令。
- 通过扩展标志,CPU可以准确识别出指令中操作码的长度
- 操作码的位数随地址数的减少而增加:
- 三地址指令操作码 每减少一种最多可多构成 2 4 2^4 24 种二地址指令
- 二地址指令操作码 每减少一种最多可多构成 2 4 2^4 24 种一地址指令
关于第3点的理解: 以三地址指令为例,假如我们使用操作码 1110 作为扩展标志
- 此时,三地址指令中少了一条(操作码位1110的一条)
- 对于二地址指令而言,多了以1110作为开头(扩展标志)的 2 4 2^4 24条指令(不考虑二地址指令的继续扩展)
2. 地址码解析
- 作用:指出操作数、下一条指令等的地址
- 对于一条指令而言,它可能有多个地址码,也可能没有地址码。其中:
- 包含0个地址字段的称为:零地址指令
- 包含1个地址字段的称为:一地址指令
- 包含2个地址字段的称为:二地址指令
- …
接下来介绍不同指令中地址码的作用
1. 四地址指令
如图
四次访存:
- 取指令(上一条指令的 A 4 A_4 A4)
- 取第一操作数
- 取第二操作数
- 存结果
若使用PC代替 A 4 A_4 A4,就成了三地址指令。每执行一条指令,PC+1(指令计数器)
2. 三地址指令
若用 A 1 或 A 2 A_1或A_2 A1或A2代替 A 3 A_3 A3,就成为了二地址指令
3. 二地址指令
若使用ACC(累加器)替代 A 1 或 A 2 A_1或A_2 A1或A2,将结果保存在ACC中,就成了一地址指令。
4. 一地址指令
- 取指令(PC)
- 取 A 1 A_1 A1中的操作数
5. 零地址指令
即没有地址码的指令
2. 指令字长
指令字长取决于:
- 操作码的长度
- 操作数地址的长度
- 操作数的地址个数
- 早期计算机,指令字长固定:指令字长=机器字长=存储字长
- 现代计算机,指令字长可变:一般为字节的整数倍。其中高频指令一般被设置为短操作码指令/短字节指令
3. 小结
- 当用一些硬件资源代替指令字中的地址码字段后
- 可扩大指令的寻址范围
- 可缩短指令字长
- 可减少访存次数
- 当指令的地址字段为寄存器时
- 可缩短指令字长
- 指令执行阶段不访存
二、操作数类型和操作类型
三、寻址方式
1. 指令寻址
指令寻址有两种方式:
- 顺序寻址:PC指令计数器实现,每条指令执行后,PC+1,得到下一条指令地址
- 跳跃寻址:由转移指令指出下一条指令的地址
需要注意:PC+1中的1是一个指令的字长
2. 数据寻址
从数据寻址的角度看,指令的一般格式如下:
- 寻址特征:数据寻址共有10种不同的寻址方式,寻址特征字段通过不同的符号表明该指令操作数的寻址方式
- 形式地址A:就是数据在指令字中的地址,实际上它不是操作数的真实地址(对某些寻址方式而言)
- 有效地址:操作数的真实地址
为了分析的简便,以下设定分析采用的模型机满足:指令字长 = 存储字长 = 机器字长
- E A EA EA 代表操作数的真实地址
- 均以单地址指令为例
1. 立即寻址
特征:形式地址A就是操作数。即指令中直接携带操作数,不需要访存取操作数。如图:
- ==#==是立即寻址的特征
- 立即寻址的特点:
- 指令执行阶段不访存(因为不需要取操作数)
- A 的位数限制了立即数的范围
2. 直接寻址
特征: E A = A EA=A EA=A,有效地址由形式地址直接给出。即形式地址A保存的就是操作数的真实地址。如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHpBxQGj-1651755353582)(https://s2.loli.net/2021/12/06/Jpk1q58hrm2EeWM.png)]
特点:
- 执行阶段访问一次存储器(取操作数)
- A 的位数决定了该指令操作数的寻址范围(做题时可根据直接寻址范围逆推A的位数)
- 操作数的地址不易修改(必须修改A)
3. 隐含寻址
特征:操作数地址隐含在操作码中。比如之前一地址指令的例子,对于一地址的加法指令,另一个操作数隐含在ACC中。隐含寻址如图:
- 指令字中少了一个地址字段,可缩短指令字长。
- 需要注意:隐含的操作数地址,实际上该操作数是通过另一条存取指令放至ACC中的
4. 间接寻址
特征: E A = ( A ) EA =(A) EA=(A),有效地址由形式地址间接提供。
- 一次间接寻址:形式地址保存一个存储单元的地址,该存储单元保存的才是操作数的真实地址
- N次间接寻址:形式地址保存存储单元 A 1 A_1 A1地址, A 1 A_1 A1保存 A 2 A_2 A2的地址…最后的 A n A_{n} An保存的才是操作数的真实地址
- 指令执行阶段访存次数:
- 一次寻址:2次
- N次寻址: N + 1 N+1 N+1 次
- 可扩大寻址范围
- 便于编制程序,可以通过修改间接存储单元中的真实地址实现修改操作数
间接寻址编程举例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tLtOcrgL-1651755353584)(https://s2.loli.net/2021/12/06/98Sq5WKZGoRQjez.png)]
主程序在201处调用子程序的执行流程分析:
- 主程序执行到201,发现201是一条调用子程序的指令,主程序做如下操作:
- 将主程序程序断点(即下一条指令202的地址)保存在存储单元==(A)==中
- 执行201,开始执行子程序
- 子程序执行完毕,遇到JMP指令(无条件转移),该指令形式地址A存储的是存储单元==(A)的地址,(A)中保存的才是该指令真正的目的地址,此时 ( A ) = 202 (A)=202 (A)=202==,CPU转移到主程序程序断点202处,继续执行主程序
注意:在这个过程中,JMP指令中的形式地址不变,始终指向存储单元==(A),通过改变存储单元(A)中的数据,实现调用不同的子程序==。
5. 寄存器寻址
特征: E A = R i EA = R_i EA=Ri,有效地址即为寄存器编号。
- 执行阶段不访存,只访问寄存器,执行速度快
- 寄存器个数有限,可缩短指令字长
- R i R_i Ri的位数决定存储器的个数。(逆推存储器位数)
6. 寄存器间接寻址
特征: E A = ( R i ) EA = ( R_i ) EA=(Ri),形式地址A保存寄存器地址 R i R_i Ri,寄存器保存操作数真实地址。
解题步骤
- 确定指令格式
- 寻址方式
- 是否需要寻址特征字段
- 是否需要使用操作码扩展技术
- 确定码长,包括指令字长和指令各字段的长度
- 依据寻址方式的特点
- 具体分配指令