計算機組成原理------擴展操作碼

首先,需要建立的一種直觀的認知是:既然是擴展操作碼,就意味着操作碼的位數越變越多! 
之所以這麼強調,是因爲常常混淆了操作碼的擴展方向。

再看擴展的原理: 
假設指令字長是16位,平均劈開成4份,高位4位用作操作碼,低12位分別用作三個地址碼。

那麼操作碼的個數就是四個二進制所能表達的離散數目:

OK,如果地址碼只能做地址碼,這是最終的結局了。 
但是,如果地址碼可以化身爲操作碼,這並不難對吧,畢竟都是二進制的數位而已。 
非常粗略的認爲,現在第一個地址4位也用作操作碼,那麼總的看來就是高8位用作操作碼,低8位用作兩個地址碼了。

按理說,即,共計有256種操作碼。 
雖然,用8位和用4位各自表達操作碼,互不干擾的。但是,實際上呢,單操作碼只有15條,且二地址的操作碼只有16條,如果還要繼續擴展,二地址的也只有15條了! 
爲什麼差別這麼大? 
答案是兩個原則不可以破:

  1. 不允許短碼是長碼的前綴
  2. 各指令的操作碼一定不能重複

爲了滿足第一條,我們看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個狀態,再第二步有種 ,乘起來就是結果。

以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章