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

    指令通常都是由兩部分組成:操做碼和操做地址。編碼

    在計算機大量的指令當中有着「二·八」定則,指的是有着20%的指令在80%的時間裏重複使用着,而80%的指令只有20%的時間在使用着。spa

    那麼爲了提升計算機的工做效率,在指令的調用上,要想辦法把那20%的指令儘量的放在近的地方,而那剩下的指令能夠放在稍微遠一些的地方,所以,赫夫曼編碼出現了。blog

1.赫夫曼編碼

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

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

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

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

    由一道例題來解釋說明it

    【例題】某臺處理機的各條指令使用頻度以下表table

指令效率

使用頻度

指令

使用頻度

指令

使用頻度

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.定長擴展碼

    隨着計算機存儲空間的日益增大,爲保證速度和下降譯碼複雜度,現不少計算機都採用了固定長度的操做碼,全部指令操做碼都是同一長度,這就是空間換時間的概念。

 

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

相關文章
相關標籤/搜索