關於指令操作碼的優化的理解


    指令一般都是由兩部分組成:操作碼和操作地址。

    在計算機大量的指令當中有着“二·八”定則,指的是有着20%的指令在80%的時間里重復使用着,而80%的指令只有20%的時間在使用着。

    那么為了提高計算機的工作效率,在指令的調用上,要想辦法把那20%的指令盡可能的放在近的地方,而那剩下的指令可以放在稍微遠一些的地方,因此,赫夫曼編碼出現了。

1.赫夫曼編碼

    赫夫曼(Huffman)編碼的基本思想:當各種事件發生的概率不均等時,可對發生概率高的事件用最短的位數(時間)來表示,而對於出現概率比較短的事件,則可以用較長的位數(時間)來表示,從而使總的平均位數(時間)縮短。

 下面介紹一下關於赫夫曼編碼的方法。

    首先要先了解到赫夫曼編碼是從下往上的方法構建二叉樹。爾其本質就是排序的一種。

    當一串數列放在眼前,就需要對其排列,規則為:永遠是數列里面兩個最小的加在一起后往上走,且兩數相加后如遇到等值數列,則放在其右邊。在赫夫曼樹中永遠是小的放在左邊而大的放在右邊,路徑為左零右一。

    由一道例題來解釋說明

    【例題】某台處理機的各條指令使用頻度如下表

指令

使用頻度

指令

使用頻度

指令

使用頻度

ADD

43%

JOM

6%

CIL

2%

SUB

13%

STO

5%

CLA

22%

JMP

7%

SHR

1%

STP

1%

現在對這個頻度表進行赫夫曼編碼

先對指令和使用頻度進行排序

從小到大為:SHR 1%    STP 1%    CIL 2%    STO 5%    JOM 6%    JMP 7%    SUB 13%    CLA 22%    ADD 43%

先進行第一次排序,最小的兩個先相加

image

現在的排序是 CIL 2%  < 2%  < STO 5% < JOM 6% < JMP 7% < SUB 13% < CLA 22% < ADD 43%

加起來的值放在等值的右邊

image

現在的排列是    4% < STO 5% < JOM 6% < JMP 7% < SUB 13% < CLA 22% < ADD 43%

image

現在的排序是  JOM 6% < JMP 7% < 9% < SUB 13% < CLA 22% < ADD 43%

image

現在的排序是 9% < SUB 13% < 13% < CLA 22% < ADD 43%

image

現在的排序是 22% < 35% < ADD 43%

最終的結果為

image

編碼為  SHR 100010    STP 100011    CIL 10000    STO 1001    JOM 1100    JMP 1101    SUB 101    CIA 111    ADD 0

平均碼長 = 位長 * 使用頻度

 

2.等長擴展碼

    在早期的計算機上,為了便於分級譯碼,一般采用等長擴展碼。常見的擴展碼有15/15/15或8/64/512。

    選用哪種編碼方法取決於指令使用頻度的分部。若在頭15指令中值比較大,但在后30中指令中急劇減少,則應該選擇15/15/15;若值的頭8種指令中較大,之后64中指令也不太低,則使用8/64/512。

image

為了方便理解,根據上面那道例題進行練習

由於上面例題編碼不長,不用使用15/15/15

我們使用3/3/3和2/7來討論

3/3/3編碼:

頻度最高的放在前面:

ADD 00    CIA 01    SUB 10    JMP 11 00    JOM 11 01    STO 11 10    CIL 11 11 00    STP 11 11 01    SHR 11 11 10

2/7編碼:

ADD 0 0    CIA 0 1    SUB 1 000    JMP 1 001    JOM 1 010    STO 1 011    CIL 1 100    STP 1 101    SHR 1 110

3.定長擴展碼

    隨着計算機存儲空間的日益增大,為保證速度和降低譯碼復雜度,現很多計算機都采用了固定長度的操作碼,所有指令操作碼都是同一長度,這就是空間換時間的概念。

 

以上,不足之處請多多指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM