已知A、B、C三类指令操作码分别为4、7、8位,求最大总指令数
可变长度操作码最大指令数计算说明
可变长操作码的译码核心规则为:短操作码不能是长操作码的前缀,避免译码歧义。从8位全编码空间的视角看,不同长度的指令占用的8位编码槽位数量不同:
- 4位的A类指令:每条占用
2^(8-4)=16个8位槽位(前4位匹配即可识别为A,后4位任意)- 7位的B类指令:每条占用
2^(8-7)=2个8位槽位(前7位匹配即可识别为B,第8位任意)- 8位的C类指令:每条占用
1个8位槽位
计算误区说明
你之前的计算默认将分配给B类的4位前缀下的所有8条B类编码全部占满,这不是最优分配策略。要实现总指令数最大,需要让短指令的数量取三类都存在的最低要求即可,因为短指令每条占用的槽位更多,不必要的短指令会占用更多可分配给C类的槽位,拉低总指令数。
正确计算过程
8位空间总共有 2^8=256 个编码槽位,总指令数计算公式推导如下:
设A类指令数量为a,B类为b,C类为c,可得约束:16a + 2b + c = 256
总指令数为:a + b + c = a + b + (256 - 16a - 2b) = 256 - 15a - b
要最大化总指令数,需最小化15a + b,结合三类指令都存在的要求a≥1、b≥1,取最小值a=1、b=1代入计算:
总指令数 = 256 - 15*1 - 1 = 240
该分配方案可落地:
- A类指令取1个4位操作码,如
0000,占用16个槽位 - B类指令取1个7位操作码,如
0001000,占用2个槽位 - 剩余
256-16-2=238个槽位全部分配给C类,共238条
三类指令均存在,总数量刚好为240。
内容的提问来源于stack exchange,提问作者Math.anony
相关产品推荐
相关产品推荐

