计算机组成与体系结构——扩展操作码

320 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、扩展操作码

MARIE的指令集中采用固定长度的操作码表示不同的指令类型

在这里插入图片描述 指令分为两大类:定长指令和变长指令,它们各有优缺:

  • 定长指令的译码相对容易但是浪费了存储空间
  • 变长指令译码复杂

而在实际运用过程中:不同类型的指令需要的操作数数量往往不同

因此,产生了扩展操作码(Expanding Opcodes):在定长的指令中,通过变长的操作码,表示更多的指令类型

在这里插入图片描述

二、扩展操作码的编码

区别操作码的长度:采用转义操作码(Escape Opcode)。转义操作码的作用是为了表示操作码的编码超过当前长度。

编码要避免操作码的重复

假设某体系结构中地址长度为4,如何采用16位字长的指令编码下列指令: 15条三地址指令,14条双地址指令,31条单地址指令,16条零地址指令

在这里插入图片描述 以上编码的流程:

  • 获取字长16、单个地址长度4

  • 从指令最短(16-4×3=4)、地址最长(4×3=12)的三地址指令开始,将前15条作为三地址指令,即0000 R1 R2 R3~1110 R1 R2 R3为三地址指令 唯一剩余的指令1111作为转义码,它是非三地址指令的标志

  • 14条二地址指令,用1111 0000 R1 R2~1111 1101 R1 R2表示 还剩余两条指令1111 11101111 1111作为转义码,它是非二、三地址指令的标志

  • 31条一地址指令,由于四位只能表示16条指令,恰好有两个转义码,刚好够,用1111 1110 0000 R1~1111 1111 1110 R1表示 还剩一条指令1111 1111 1111作为转义码它是无地址指令的标志

  • 最后剩下的刚好就是16条地址指令1111 1111 1111 0000~1111 1111 1111 1111作为无地址指令

此时:每条指令都是唯一的,通过识别转义码能够找到唯一的操作,对译码操作是非常友好的

if(IR[15:12] != 1111){
	译码并执行对应的三地址指令
}else(IR[15:9] != 1111 111){
	译码并执行对应的双地址指令
}else(IR[15:4] != 1111 1111 1111){
	译码并执行对应的单地址指令
}else{
	译码并执行对应的零地址指令
}

三、扩展操作码计算练习

假设地址长度为4,指令长度为8 15条单地址指令,最多_____条无地址指令; 14条单地址指令,最多_____条无地址指令; 13条单地址指令,最多_____条无地址指令;

答:
	16。操作码4+地址4,0000~1110作为单地址指令,转义码1111,1111 0000~1111 1111作为无地址指令,共16
	32。0000~1101作为单地址指令,转义码1111和1110,1110 0000~1111 1111作为无地址指令,共32
	48。0000~1100作为单地址指令,转义码1111、1110和1101,1101 0000~1111 1111作为无地址指令,共48

在这里插入图片描述

某台计算机指令字长为32,地址长度为12,假设有250条双地址指令,那么最多还可以有_____条单地址指令

答:
	双地址指令为操作码8位+地址一12位+地址二12位,2^8=256>250,因此足够表示双地址指令。那么就用前250个操作码0000 0000~1111 1001(0~249,共250)作为双地址指令。
	剩余的操作码作为转义码,1111 1010~1111 1111(250~255,共6)
	单地址指令为操作码20位+地址12位,对于每个操作码,能够表示的指令从xxxx xxxx 0000 0000 0000~xxxx xxxx 1111 1111 1111(0~4095,共4096),x表示操作码
	
	因此,总共还能表示4096×6=24576个单地址指令

	计算表示:(2^32 - 250 * 2^12 * 2^12) / 2^12 = 24576
	总共表示2^32个数,一个地址位能表示2^12个地址,两个地址位2^24个地址
	除去所有双地址,还剩2^32-250×2^24个指令,这些指令只有一个地址,共2^12种
	(转义码数量×地址总数=所有情况)
	因此最后是(2^32 - 250 * 2^12 * 2^12) / 2^12 = 24576条指令