指令一般都是由兩部分組成:操作碼和操作地址。
在計算機大量的指令當中有着“二·八”定則,指的是有着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%
先進行第一次排序,最小的兩個先相加
現在的排序是 CIL 2% < 2% < STO 5% < JOM 6% < JMP 7% < SUB 13% < CLA 22% < ADD 43%
加起來的值放在等值的右邊
現在的排列是 4% < STO 5% < JOM 6% < JMP 7% < SUB 13% < CLA 22% < ADD 43%
現在的排序是 JOM 6% < JMP 7% < 9% < SUB 13% < CLA 22% < ADD 43%
現在的排序是 9% < SUB 13% < 13% < CLA 22% < ADD 43%
現在的排序是 22% < 35% < ADD 43%
最終的結果為
編碼為 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。
為了方便理解,根據上面那道例題進行練習
由於上面例題編碼不長,不用使用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.定長擴展碼
隨着計算機存儲空間的日益增大,為保證速度和降低譯碼復雜度,現很多計算機都采用了固定長度的操作碼,所有指令操作碼都是同一長度,這就是空間換時間的概念。
以上,不足之處請多多指正。