本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、扩展操作码
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 1110和1111 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条指令