首先,需要建立的一种直观的认知是:既然是扩展操作码,就意味着操作码的位数越变越多!
之所以这么强调,是因为常常混淆了操作码的扩展方向。
再看扩展的原理:
假设指令字长是16位,平均劈开成4份,高位4位用作操作码,低12位分别用作三个地址码。
那么操作码的个数就是四个二进制所能表达的离散数目:
OK,如果地址码只能做地址码,这是最终的结局了。
但是,如果地址码可以化身为操作码,这并不难对吧,毕竟都是二进制的数位而已。
非常粗略的认为,现在第一个地址4位也用作操作码,那么总的看来就是高8位用作操作码,低8位用作两个地址码了。
按理说,即,共计有256种操作码。
虽然,用8位和用4位各自表达操作码,互不干扰的。但是,实际上呢,单操作码只有15条,且二地址的操作码只有16条,如果还要继续扩展,二地址的也只有15条了!
为什么差别这么大?
答案是两个原则不可以破:
为了满足第一条,我们看8位操作码的时候,前面四位全是四位操作码已经出现过的!
所以,设计思路只能变成:前面四位只用15种离散状态,保留一个给二地址扩展用。因此,8位操作码,实际上限定了高4位的值,只是低四位可以离散,共16种状态,要想再继续扩展,自己最多只敢用15种,还得保留一个种子呢!
这便是整个的扩展操作码的原理。当然可以有其他变种,这里不做展开。
看一个例子:
一个计算机系统采用32位单字长指令,地址码是12位,如果定义了250条二地址指令,那么还有(24K )条单地址指令。
怎么理解,这里的地址码限定为12位,说的是一个地址码就12位,如果有2个地址,那就是24位了!我会下意识的以为,哦,只分配12位作地址码,这是不对的。
由原理分析我们知道得问自己一下,这个是不是从三地址开始扩展来的?计算一下,12*3 = 36,超过了总的位数,因此,二地址是起点。之所以这么想,是因为我们知道二地址不一定是扩展的起点。
二地址共用掉24位作操作数地址,高位有8位作操作码。共有种操作码状态,现在只用了250种,因此,还有6个可以供下一个扩展用,一地址码就意味着有中间12位可以做操作码,于是根据乘法原理:. 这里不考虑继续扩展成0地址码,因为问的是可以有,考虑的是最多可以有,是上限值。
题一:某计算机指令字长为16位,指令有双操作数、单操作数和无操作数3种格式,每个操作数字段均用6位二进制表示,该指令系统共有m条(m<16)双操作数指令,并存在无操作数指令。若采用扩展操作码技术,那么最多还可设计出()条单操作数指令。
A.2^6 B.(2^4-m)*(2^6)-1
C.(2^4-m)*2^6 D.(2^4-m)*(2^6-1)
答案选B
分析:
对于双操作数指令而言,两个长度为6位的操作数共占了12位,剩余的4位用作操作码,所以可以设计出2的四次方个双操作数指令。系统中已经设计出了m条双操作数指令,那么剩余的2^4-m条可以用于设计单操作数的操作码。对于单操作数指令而言,它的操作码长度为16-6=10位。题目中要求使用扩展操作码技术,所以单操作数指令在原来的双操作数指令的4位操作码上可以扩展10-4=6位,所以最多可以设计出(2^4-m)*(2^6)-1条单操作数的指令。减去1的原因是“存在无操作数指令”,所以至少留下一个用来扩展无操作数指令。
题二:指令字长为16位,采用扩展操作码技术,要求形成15条三地址指令、12条二地址指令、31条一地址指令和16条零地址指令。
三地址:(15条)
0000 **** **** ****
... ... ... ...
1110 **** **** ****
二地址:(12条)
1111 0000 **** ****
... ... ... ...
1111 1011 **** ****
一地址:(31条)
1111 1100 0000 ****
... ... ... ...
1111 1101 1110 ****
零地址:(16条)
1111 1101 1111 0000
... ... ... ...
1111 1101 1111 1111
如果是给定指令字长,再给你一些需求,如何设计满足需求的指令格式?
光说没用,以实例求证。
假设指令字长是16位,操作数的地址码是6位,指令有0地址,一地址,二地址三种。
第一道
1)设固定操作码,若0地址指令有M种,一地址指令有N种,则二地址指令最多多少种?
解析:这个题只需要贯通固定的含义即可:无论是0地址还是1地址,亦或者是2地址,操作码位数都固定着,虽然很少,也不必介怀。因此,计算固定操作码的位数,就由最多的地址码位数决定。即:二地址时,地址码位数12位,那么只给操作码留下4位,共16种离散状态。也即二地址指令只有:16-M-N种.
第二道
采用扩展操作码技术,二地址指令最多有多少种?
解析:一般情况下,我们由多地址指令反向推导少地址指令,也即,按照扩展的思路进行,现在是反向考察,自然心里上就有一些抵触。
但是,我们不妨仍从正向角度出发:即,设二地址最多是X种,作为一个变量。那么我们知道二地址的时候,留给操作码的位数是4位,最多的离散状态是16种,现在二地址指令是X种,不能用光了16种状态,所以,。
再去扩展一地址指令:二地址留下16-X种作为扩展的种子。到这里,突然间发现,不必再往下看了,既然M,N都只是变量而已,根本不能对X形成什么约束,X的约束只是来自于:要留至少一个状态作为一地址的扩展。
于是:X最牛可以是15。就这样。
第三道
采用扩展码技术,若二地址指令有P条,0地址指令有Q条,则一地址指令最多几条?
解析:现在我们知道,解题的角度还是从最少的操作码开始推算:二地址留给操作码的位数是4位,共16种离散状态,也即最多16条,现在有P条指令,意味着16-P个状态用作扩展一地址指令了。
具体16-P要乘以什么呢,得由0地址推导得来。
0地址指令低6位共64种状态,设一地址留了X个状态用于0地址扩展,那么0地址共有64X = Q种。推导出
因此一地址指令数目
==>
也即:中间6位共64种状态有(16-P)*64 - Q/64用来做一地址自身了,于是一地址共有:(16-P)*64-Q/64种。
这里说最多,是因为,一地址指令可以设计的比这小,虽然理论上可以这么多。
以上。
PS: 乘法原理就是分步用乘法,比如高位有6个状态,再第二步有种 ,乘起来就是结果。
以上。