知识储备:
指令是由操作码和地址码两部分组成的。
扩展操作码编码是界于定长二进制编码和完全的哈夫曼编码之间的一种编码方式。该编码方式利用了是高概率的用短码、低概率的用长码表示的哈夫曼压缩思想,使操作码平均长度缩短,以降低信息冗余度,提高运行效率。
注意:无论是哈夫曼编码,还是扩展操作码编码,其中的短码都不能与长码的首部相同。因为指令中除了操作码外,后面所跟的是操作数或是操作数所在的寄存器编码或是存储单元的地址吗,而它们又都是以二进制编码的形式出现的,所以如果短操作码成了长操作码的前缀,就会使指令操作码译码时无法做到唯一译码和立即解码。
例题
【例题1】若某机要求有:三地址指令4条,单地址指令255条,零地址指令16条。设指令字长为12位,每个地址码长为3位。能否以扩展操作码为其编码?如果单地址指令改为254条呢?
根据题意,易得出 三地址指令的操作码长为12-3*3=3位。所以三地址指令的格式为:
操作码(3位) | 地址1(3位) | 地址2(3位) | 地址1(3位) |
操作码占了3位,用8个不同码中的4个码表示4条三地址指令,余下的4个码用作长操作码的扩展标志。
单地址指令的操作码长为12-1*3=9位。单地址指令的格式为:
操作码(9位) | 地址1(3位) |
如果不考虑零地址操作码,短操作码中的4个扩展标志各自可以扩展出6位(9-3=6)操作码,则共扩展表示出 条单地址指令。但是,现在还是表示16条零地址指令。所以用256个不同码中的255个码表示255条单地址指令,余下的1个用作零地址指令操作码的扩展标志。
零地址指令的操作码长为12位。零地址指令的格式为:
操作码(12位) |
因为零地址指令操作码的高9位只有1个码做扩展标志,所以能扩展出3位(12-9=3)操作码,则共扩展表示出 条零地址指令,不满足题目要求。
所以综上所述,不能以扩展码为其编码。
对于第二问:将单地址指令条数改为254。那么零地址指令操作码的高9位有2个码做扩展标志,则共扩展表示出 条零地址指令,刚好满足题目要求。
【例题1-2】某模型机9条指令的使用频度如表所示。要求有两种指令字长,都按双操作数指令格式编排,采用扩展操作码,并限制只能有两种操作码码长。设该机有若干通用寄存器,主存为16位宽,按字节编址,采用按整数边界存储,任何指令都在一个主存周期中取得,短指令为寄存器——寄存器型,长指令为寄存器—主存型,主存地址应能变址寻址。
指令 使用频度 ADD(加) 30% SUB(减) 24% CLA(清加) 20% STO(存) 7% JMP(转移) 7% JOM(按负转移) 6% CIL(循环左移) 3% SHR(右移) 2% STP(停机) 1%
构造哈夫曼树。(此处“左1右0”是为了便于我的老师判卷)
由哈夫曼树,得到哈夫曼编码:
操作码的平均码长为: 位。
因为题目要求“限制只能有两种操作码长”,故而采用2-5扩展的操作编码:
此时的操作码的平均码长为 位。
题目中“按字节编址”,易知 短指令共8位。
以8位短指令采用短操作码为例:
8位短指令中2位为操作码,目标寄存器和源寄存器是等价的,所以剩余6位中每3位表示一个寄存器。所以该机允许使用的可编址的通用寄存器个数为 个。
短指令格式为
OP 操作码(2位) | 寄存器1(3位) | 寄存器2(3位) |
访主存操作数寻址的最大相对位移量为32个字节(,补码的偏移量为 -16~+15 个字节),所以“相对位移”占5位。
长指令的长度为16位,其中操作码占5位,寄存器占3位,相对位移占5位,剩余3位用作变址寄存器。主存逻辑地址=变址寄存器+相对位移。
长指令格式为:
OP 操作码(5位) | 寄存器1(3位) | 主存逻辑地址(8位) |