指令格式是指令使用二进制编码表示的结构形式,一般一条指令分为操作码和地址码两部分:
一、操作码
操作码表示指令的属性功能和执行的指令类型。操作数对应的二进制位数决定了计算机能够实现的最大指令数目。例如,操作码是 7 位的二进制码,计算机能够实现的最大指令数目是 128(2^7)。操作码根据二进制位数是否具有可变性将其细分为固定长度和可变长度两种。
-
固定长度操作码就是保持二进制位数不变,所有指令的操作码长度都等于某一固定值,并且它们必须在一个字段中。它的优点主要有:规整的指令格式,简化的底层硬件设计,非常短的指令译码时间,提高了计算机系统的整体性能。但是指令的编码效率低,具有很大的信息的冗余度,使代码的总长度大大增加,可扩展性差。RISC- V 采用的方案就是固定长度操作码。
-
可变长度操作码,也被称作扩展操作码,它是对相关操作码的扩展,可以对操作码的二进制长度进行改变和重新设置,并且可同时存在于多个字段中。可变长度的操作码通常会将特定的字段作为对应的操作码,而剩余的指令部分,会使用扩展的方式对应到地址码。
二、地址码
地址码的功能是不同于操作码的,地址码的主要功能是用来表明指令操作的对象,获得被操作对象的地址、操作数的存储地址以及寄存设备地址等。地址码的结构比操作码要更复杂的多,主要包括存储源操作数的地址、存储结果的目的操作数地址、以及将要跳转链接的下一条指令的地址。下一条指令的地址一般都是隐式存在的,必须通过计算分析才能够得到。根据一条指令中操作数地址数量,将地址码划分成以下几种类型。
1、零地址码
零地址码的指令,仅仅只有一个操作码而没有地址码,其指令格式如下图所示,op代表操作码。零地址码指令无须先设置对应的操作数,这有可能是事先已经设置好了操作数。例如空操作、停机等指令。
2、一地址码
一地址码的指令,只有一个存储操作数的地址,也是最终处理结果的保存地址, 它也被称作单操作数指令。其指令格式如下图所示,op 代表操作码,rs1 代表操作数地址。例如自增运算,在处理完该地址的操作数之后,将最终处理结果存回原来的地址中。
3、二地址码
二地址码的指令,也被称作双操作数指令,是当前阶段计算机系统中应用最广泛的。其指令格式如下图所示,op 是操作码,rs1 表示源操作数地址和最终处理结果的存储目的地址,rs2 表示另外一个源操作数地址。
4、三地址码
三地址码的指令,具有三个地址存放操作数。指令格式如下图所示,op 代表操作码,rs1 代表源操作数地址,rs2 代表另外一个源操作数地址,rd 代表目的操作数地址即存放处理结果的地址。