擴充套件操作碼的總結

2021-07-23 08:39:35 字數 1322 閱讀 7726

需要建立的一種直觀的認知是:既然是擴充套件操作碼,就意味著操作碼的位數越變越多!

之所以這麼強調,是因為常常混淆了操作碼的擴充套件方向。

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

=16

ok,如果位址碼只能做位址碼,這是最終的結局了。

但是,如果位址碼可以化身為操作碼,這並不難對吧,畢竟都是二進位制的數字而已。

非常粗略的認為,現在第乙個位址4位也用作操作碼,那麼總的看來就是高8位用作操作碼,低8位用作兩個位址碼了。

按理說28=

256 ,即,共計有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位作操作碼。共有28

=256

種操作碼狀態,現在只用了250種,因此,還有6個可以供下乙個擴充套件用,一位址碼就意味著有中間12位可以做操作碼,於是根據乘法原理:6∗

212=24

k . 這裡不考慮繼續擴充套件成0位址碼,因為問的是可以有,考慮的是最多可以有,是上限值。

ps: 210

=1k,

220=1

m,230

=1g ,乘法原理就是分步用乘法,比如高位有6個狀態,再第二步有212

種 ,乘起來就是結果。

以上。

指令操作碼擴充套件

題一 某計算機指令字長為16位,指令有雙運算元 單運算元和無運算元3種格式,每個運算元欄位均用6位二進位制表示,該指令系統共有m條 m 16 雙運算元指令,並存在無運算元指令。若採用擴充套件操作碼技術,那麼最多還可設計出 條單運算元指令。a 2 6 b 2 4 m 2 6 1 c 2 4 m 2 6...

擴充套件操作碼技術

方法一 固定操作碼的設計方式 0000 x yyyy zzzz 1111 x yyyy zzzz 16條三位址指令 方法二 可變操作碼的設計方法 擴充套件方式1 0000 x yyyy zzzz 1110 x yyyy zzzz 15條三位址指令 1111 0000 x yyyy 1111 1110...

擴充套件操作碼的程式設計實現

include include include void process int n int j 0 while n 1 for int m 3 m 0 m printf d tem m printf void main process a 1 printf x x x n process a pr...