指令简述及分类


思维导图

指令(又称机器指令)

指示计算机执行某种操作的命令,是计算机运行的最小功能单位。

指令集、指令系统:一台计算机上的所有指令的集合

? 又叫架构——Intel上用X86、手机上用的是ARM架构

指令格式

一条指令就是机器语言的一个语句,是一组二进制代码

有两部分:操作码(OP)、地址码(A)  //四种分类从此发散:OP、A、OP+A各自长度、OP的目的

操作码:做什么? 地址码:对谁动手?

分类

按地址码数目

地址码数目不同而分类:0-4地址指令

特别:停机指令是不需要地址码的 检测到操作数就ok了就停机

零地址指令

1、不需要操作数,如空操作、停机、关中断等指令

2、堆栈计算机买两个操作数隐含在栈顶、次栈顶,计算结果压回栈顶。

就是基于数据结构中的后缀表达式形成的

例:

数据结构的“后缀表达式”

A + B - C * D	//在一个栈中,遇到A、B等数据就存入,遇到运算符就运算,然后将运算结果再存入栈。零地址指令在这里就相当于“运算符”

一地址指令

1、只需要单操作数,如加1、减1,取反、求补

	OP(A1) → A1		//完成一条指令需要三次访存,,取指令、读取A1、写入A1

2、需要两个操作数,但是其中一个操作数隐含在某个寄存器

A1是指某个主存的地址,(A1)表示这个地址中所指向的内容。

这里隐含在ACC

(ACC)OP(A1) → ACC	//CPU取出一个操作数,然后操作再返回A1所指向的地址。ACC是累加寄存器,因为最后是存到ACC,所以不需要第二次访存,所以只要两次
					完成一条指令需要访问两次内存:取值、读取A1

二地址指令

OP|A1(目的操作数)|A2(源操作数)

常用于需要两个操作数的算术运算、逻辑运算

(A1)OP(A2) → A1			//访存次数4次:取指令、读A1、读A2、写到A1

三地址指令

OP|A1|A2|A3(结果)

常常用于需要两个操作数的算术运算、逻辑运算

(A1)OP(A2) → A3			//访存次数4次:取指令、读A1、读A2、写到A3

四地址指令

OP|A1|A2|A3(结果)|A4(下一条地址)
前面部分是跟三地址完全一样。
(A1)OP(A2) → A3		A4=下一条要执行的指令的地址 	//访存次数4次:取指令、读A1、读A2、写到A3
特殊之处

? 正常情况下:取指令后PC+1,就指向了下一条指令

? 四地址指令:取指令后,将PC的值修改为A4所指的地址。

按指令长度

指令字长:一条指令的总长度

机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常与ALU相关)

存储字长:一个存储单元中二进制代码的位数(通常和MDR位数相同)

一些通用叫法

半字长指令、单字长指令、双字长指令 ——指令长度是机器字长的多少倍

指令字长会影响取指令所需要的时间。

例:

机器字长 = 存储字长 = 16bit,取一条双字长指令

——双字长是32bit ,取一条双字长指令就需要两次访存。

按照操作码长度

显然,操作码的数量可以显示这个系统的能够操作多少个指令

定长操作码:

指令系统中所有指令的操作码长度相同。

n位 ——> 2^n条指令

特点:控制器的译码电路设计简单,但是灵活性低。

另:地址码的位数的影响——指令总长度不变,地址码数量越多,寻址能力越差,太多了效率就下降了。

可变长操作码:

指令系统中各指令的操作码长度有变化

特点:设计复杂,灵活度高。

定长指令字结构 + 可变长操作码 ——> 拓展操作码指令格式

按照操作类型

其实移位操作也是逻辑操作的一部分

1、数据传送【进行主存和CPU之间的数据传送】

LOAD	//把数据: 存储器 ——> 寄存器 
STORE	//把数据: 寄存器 ——> 存储器

2、算术逻辑操作【运算】

算术:加减乘除
逻辑:与或非

3、移位操作【运算】

算术移位、逻辑移位、循环移位

4、转移操作【改变程序执行的顺序】

无条件转移	JMP
条件转移	JZ:结果为0;JO:结果溢出;JC:结果有进位
调用和返回	CALL、RETURN
陷阱

为什么会有转移操作?

一般程序是顺序执行,但是有else if这种语句,所以要让程序流改变,就出现了转移指令,改变PC的值。

5、输入输出操作【CPU和I/O设备之间的数据传送】

CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器)