指令的基本格式
一条指令就是机器语言的一个语句,是一组有意义的二进制代码。一条指令通常包括操作码字段和地址码字段两部分:
零地址指令
只给出操作码OP,没有显式地址,这种地址有两种可能:
- 不需要操作数的指令,如空操作指令、停机指令、关中断指令等。
- 零地址的运算类指令仅用在堆栈计算机(例如后缀表达式)中。
一地址指令
只有目的操作数的单操作数指令,按$A_1$地址读取操作数,进行OP操作后,结果存回原地址。
指令含义:$OP(A_1)->A_1$
如操作码含义是加1、减1、求反、求补等。
隐含约定目的地址的双操作数指令,
例ACC,
指令函数:(ACC)OP$(A_1)$->ACC
若指令字长为32位,操作码占8位,1个地址码字段占24位,则指令操作数的直接寻址范围位$2^{24}=16M$。
二地址指令
常用于两个操作数的算数运算、逻辑运算相关指令
指令含义:$(A_1)OP(A_2)->A_1$
三地址指令
常用于序列两个操作数的算数运算、逻辑运算相关指令,结果用地址保存。
指令含义:$(A_1)OP(A_2)->A_3$
四地址指令
指令含义$(A_1)OP(A_2)->A_3, A_4=$下一条将要执行指令的地址。
完成指令需要访存4次,取指->读A1->读A2 ->写A3
指令长度分类
指令字长:一条指令的总长度。
机器字长:CPU进行依次整数运算所能处理的二进制数据的位数(通常与ALU有关)。
存储字长:一个存储单元中二进制代码位数(通常和MDR位数相同)。
半字长指令、单字长指令、双字长指令——通常指指令长度是机器字长的多少倍。
定长指令字结构:指令系统所有指令长度都相等。
变长指令字结构:指令系统中指令长度不等。
操作类型分类
数据传送
LOAD :把存储器中的数据放到寄存器中。
STORE :把寄存器中的数据放到存储器中。
算数逻辑操作
加减乘除,逻辑就是与或非等运算。
移位操作
算术移位、逻辑移位、循环移位等。
转移操作
有无条件转移(JMP)、条件转移(BRANCH)、调用(CALL)、返回(SET)等。
输入输出操作
CPU寄存器与IO端口之间的数据传达。
拓展操作码指令格式
例:
设指令字长为16位,每个地址码占4位;
前4位位基本操作码字段OP,另外3个4位长做地址字段。
4位基本操作码全用于三地址指令,则有16条。
但至少需将1111留作拓展操作码用,即三指令为15条、
而1111 1111也需留作拓展操作码用,二指令条为15条、
1111 1111 1111也需留作拓展操作码用,一指令条为15条、
零地址指令为16条。
在设计拓展操作码需注意:
- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
- 各指令的操作码一定不能重复。
通常情况下,对使用频率较高的指令分配较短的操作码,对使用频率较低的指令分配较长的操作码。
设地址长度为n,上一层流出m种状态,下一层可拓展出$m \times 2^n$种状态。