第四章指令系统
4.1 指令系统
指令其实就是计算机执行某种操作的命令。具体分为:宏指令、机器指令、微指令。例如软件想操作系统中发送一个写内存的宏指令,然后操作系统对cpu发出一系列取指、译码、执行的机器指令,最终cpu将这些机器指令转化为对硬件的操作信号(电路信号0、1),即微指令。
我们所说的指令都是机器指令
4.2 指令格式
一条指令分为操作码部分(负责确定操作和获取数据)和地址码部分(负责控制地址)
这里将地址指令个数的不同,又将其进行了细分:
- 三地址指令:从地址A和B获取数据,进行操作,将结果保存在C(add、sub)
- 二地址指令:将地址A的数据进行操作,结果保存在B(mov)
- 一地址指令:将地址A的数据进行操作,结果还保存在A(inc)
- 零地址指令:控制类指令(ret)
这里有几个概念性的问题:
机器字长:CPU一次能处理的二进制数据的位数
指令字长:一条指令中包含二进制数据的位数(CPU可以一次处理多条指令)
指令字长等于机器字长的指令,称为单字长指令
指令字长等于半个机器字长的指令,称为半字长指令
指令字长等于两个机器字长的指令,称为双字长指令
存储字长:一个存储单元存储二进制代码的位数
4.3 操作数类型
4.4 指令和数据的寻址方式(重点)
寻址方式是指CPU根据地址码找到下一条指令或操作数的方式,分为指令寻址和数据寻址
一、指令寻址
顺序寻址:PC = PC+1,也就是程序计数器自动寻找下一条指令的地址
跳跃寻址:通过JMP转移类指令实现
二、操作数寻址
通常我们要寻找操作数,其可能存放的位置有
- 指令
- CPU某一寄存器
- 内存
所以我们要根据操作数的位置不同,实现不同的寻址方式
1.隐含寻址
对于一些特殊的操作数,其数值固定地存放在隐含地寄存器中,所以我们不需要显式地指出就可以访问到
2.立即寻址
操作数就在指令本身,立刻可以使用,不需要访问地址
3.直接寻址
地址码中存放的是操作数在内存的地址,我们需要一次访存来获取操作数
4.间接寻址
地址码中存放的是一个地址,这个地址对应了内存中存放操作数的地址,也就类似于C语言中的指针,指向了操作数的地址
5.寄存器寻址
地址码存放的是寄存器的编号,也就是操作数存放在寄存器中
6.寄存器间接寻址
地址码存放是寄存器的编号,寄存器存放的是操作数在内存中的地址,也就相当于指针保存在寄存器中
7.相对寻址
由PC提供基地址,指令的地址码提供偏移地址或者位移量,两者相加得到操作数的有效地址
8.基址寻址
这次基地址由基址寄存器给出,指令的地址码提供偏移地址或者位移量,两者相加得到操作数的有效地址
9.变址寻址
这次由指令提供基地址,CPU中特定的变址寄存器提供偏移值,以形成操作数的有效地址
总结一下
操作数在内存中主要是:一次访存(直接)、两次访存(间接)、寄存器访存(寄存器间接)、带偏移寻址(相对、基址、变址)
操作数在指令中:立即寻址
操作数在寄存器中:寄存器寻址、隐含寻址
4.5 CISC与RISC的基本概念
目前比较普遍的两个指令集分别是X86架构的CISC(Complex Instruction Set Computer)和ARM、MIPS架构的RISC(Reduced Instruction Set Computer)
4.5.1 复杂指令系统CISC
CISC的主要特点如下:
- 指令数目很多
- 指令的长度不固定,指令的格式多,寻址方式多
- 指令的使用频率相差很大(二八定律)
- 指令采用微程序控制,难以优化编译,运行速度慢
CISC主要应用在桌面PC,笔记本电脑市场
4.5.2 精简指令系统RISC
RISC设计初衷是为了简化指令系统,尽量使用寄存器——寄存器的操作指令,指令的格式也要求一致,其主要特点如下:
- 尽量选取使用频率高的简单指令,复杂指令的功能由简单指令组合实现
- 指令长度固定,指令格式少,寻址方式少
- 只有Load/Store指令访存,其余指令都在寄存器之间进行
- CPU中通用寄存器比较多,采用流水线技术
- 指令采用硬布线控制,重视编译优化,以减少程序运行时间
RISC主要应用在移动端,手机市场。
4.5.3 CISC和RISC的对比
我觉得RISC比CISC优势还是很大的:
①RISC更能提高运算速度,寄存器多,指令少,采用流水线技术
②RISC有利于编译程序的代码优化。
本章小结
- 一台计算机所有的指令集合被称之为指令系统,其通常由操作码和地址码字段组成
- 地址码格式有三地址、二地址、单地址和零地址;指令字长分别为:单字长,半字长,双字长
- 指令寻址方式分为顺序寻址和跳跃寻址
- 操作数寻址方式通常有上面提到的九种加上段寄存器寻址等
- RISC和CISC的对比,各自的优缺点