思维导图
指令(又称机器指令)
是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。
指令集、指令系统:一台计算机上的所有指令的集合
又叫架构——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接口中的寄存器)