计组_扩展操作码指令格式

对于可变长指令

不同指令的开头不可以一致(否则可能导致混淆) 有点儿像哈夫曼编码

    可以用如下方式(十六进制)描述各个长度下的二进制操作码的不同代码 0~E F0~FE FF0~FFE(12位操作码,只取到FFE是将FFF预留作扩展操作码之用,这样我们可以根据前12位就可以知道该指令不可能是12位操作码之外的指令类型;上述的范围只取到*E,类似的用意) FFF0~FFFF(16位操作码,操作码最长上限,已经占用了指令字长的所有位,不需要再预留给具有更长操作码的指令了) 实际上,上述划分方案是一种连续的划分 尽管如此,上述方案只是一种可能的方案,也可以有其他扩展方案 譬如,我们需要设计具有12操作码的指令比较多,那么我们可以调整位数较少的操作码的指令类型的取值范围(主要是指上限) 另外,操作码的位数会随着 地址数的减少而增加 譬如,我们可以安排其形成:15条 三地址指令(此时的指令有4位操作码,三地址占用3*4=12位的容量),12条2地址指令;63条一地址指令和16条0地址指令(16位操作码);可以如下安排4种长度(4/8/12/16bit)操作码的取值范围(离散十六进制数(一位十六进制数相当于4位二进制数),闭区间) [0,E] [F0,FB] [FC0,FFE] (包含 F F E − F C 0 + 1 = 03 E + 1 = 03 F 16 进 制 = 3 × 1 6 1 + 15 × 1 6 0 = 48 + 15 = 63 FFE-FC0+1=03E+1=03F_{16进制}=3 imes16^1+15 imes16^0=48+15=63 FFE−FC0+1=03E+1=03F16进制=3×161+15×160=48+15=63条) [FFF0,FFFF] (包含 F F F F − F F F 0 + 1 = 16 FFFF-FFF0+1=16 FFFF−FFF0+1=16条(16位长度操作码)的0地址指令)

指令设计要点

    不允许 短码是 长码的 前缀,即短操作码不能与长操作码的 前面部分的代码相同。 各指令的 操作码一定不能。 譬如,8位操作码的指令和12位操作码的指令之间的区分: 12位操作码的指令的操作码的前8位不可以和8位操作码的指令的操作码有重复 应该能够做到,cpu要取具有8位操作码指令的时候,仅仅根据指令的前八位操作码,就可以认出该指令是不是8位操作码指令(而不是4位操作码指令或者12位操作码指令) (从上例途中的安排方式)我们也可以看出,从(0~3)位操作码我们可以排除4位操作码的指令;从(4~7)位操作码我们可以排除具有超过8位操作码的指令 拥有较短的指令码的指令可以执行指令的复杂度不见得一定比较长操作码的指令来的简单(取决于计算机怎么设计的) 对于使用频率较高的指令分配较短的操作码,对使用频率较低的指令分配较长的操作码,从而尽可能减少指令译码和分析的时间. 另外,对于长操作码的指令的分配会占用一部分短操作码指令的范围(数目)(通过对短操作码的预留(保留不用做短操作码的那一部分给长操作码指令,预留得多,长操作码指令就可以多设计)))

例题巩固

对于(2)

操作码位数 max(该操作码长度下的最大数量) real(该操作码长度的实际分配数量) residula(短操作码预留下来的"桶(可以扩展的)"数量) 4bit 2 4 2^4 24 X(题目给的条件,已知) 2 4 − X 2^4-X 24−X 10(=4+6)bit(扩展一个地址码之后,操作码的位数) ( 2 4 − X ) × 2 6 (2^4-X) imes2^6 (24−X)×26(6是单个地址码的长度) M(代求未知数) ( 2 4 − X ) × 2 6 − M (2^4-X) imes2^6-M (24−X)×26−M 16(4+6+6))bit ( ( 2 4 − X ) × 2 6 − M ) × 2 6 ((2^4-X) imes2^6-M) imes2^6 ((24−X)×26−M)×26 Y(已知) Null(此种指令操作码已经占用所以指令字长bit)

( ( 2 4 − X ) × 2 6 − M ) × 2 6 = Y ((2^4-X) imes2^6-M) imes2^6=Y ((24−X)×26−M)×26=Y

经验分享 程序员 微信小程序 职场和发展