一、指令格式
指令:操作碼字段 地址碼字段
指令字(簡稱指令):表示一條指令的機器字。
指令格式:是指令自用二進制代碼表示的結構形式,由操作碼字段和地址碼字段組成。
操作碼字段:表征指令的操作特性與功能 (指令的唯一標識) 不同的指令操作碼不能相同
地址碼字段:指定參與操作的操作數的地址碼
二、操作碼分類
操作碼可以分為固定長度的代碼和可變長度的代碼
1、固定長度的代碼
多有指令操作碼的長度相等
例如:某計算機共有64條指令,采用固定長度操作碼,需要6位編碼,從000000~111111 2的6次方為64
優點:編碼方法簡單,便於指令的譯碼
確定:不方便指令系統中增加新的指令(擴展不方便)
2、可變長度的代碼
不等長的指令操作碼可以減小操作碼的平均長度,提高指令編碼的效率,從指令的擴展性來看,也希望操作碼長度可變。
例如:設某台計算機有100條指令,要求:
1)采用固定長度操作碼編碼,請設計其操作碼編碼
2)假設這100條指令中有10條指令的使用改了達到90%。其余90條指令的使用概率達到10%,請采用不定長編碼設計一種操作碼編碼的方案,並求出操作碼的平均長度(常用指令用短編碼 不常用指令用長編碼)
答、1)采用固定長度操作碼編碼,需要7位操作碼,取其中100個代碼作為操作碼 0000000~1100011之間的代碼代表100條指令(長度為7)
其余的1100100~1111111共28個代碼可用於增加新的操作碼
2)采用不固定長度的操作碼編碼,可以用4位代碼對10條指令進行編碼,用8位代碼對90條指令進行編碼
0000~1001對應10條常用的指令,從未使用的1010~1111的代碼后面擴展4位
10100000~10101111 16個
10110000~10111111 16個
11000000~11001111 16個
11010000~11011111 16個
11100000~11101111 16個
11110000~11111001 10個
已上的1010 ,0000~1111,1001之間的90個代碼表示其余90條指令
指令操作碼的平均長度為:
4*90%+8*10%=4.4 小於等長編碼的7位
剩余的編碼11111010~1111111(6個)可用於操作碼長度的進一步的擴展
例:設有一台簡單計算機的指令系統共有10條指令,各指令的使用頻率如下:
11 20% 12 12% 13 11% 14 15% 15 8% 16 3% 17 2% 18 18% 19 10% 110 1%
1)用霍夫曼編碼設計這10條指令的操作碼,並計算操作碼的平均長度
2)設計只有2中長度,且平均長度不大於3.20位的等長擴展操作碼,並計算操作碼的平均長度
答:1)霍夫曼樹為

霍夫曼編碼結果如:(左支代表0 右支代表1 從最后邊0.20開始霍夫曼編碼如下)
11 011 010 001 101 100 0001 00001 000001 000000
平均長度:3.03 =2*0.2+3*-.18+3*0.15+....
2)一種設計方案是取3位和4位兩種長度,如000 001 010 011 100 101 1100 1101 1110 1111
平均長度為3.14
3位可以表示8種編碼,我們選取7個來表示三位編碼,還剩4個需要擴展 也就是需要2位
另一種設計方案是選擇3和5兩種長度,如:000 001 010 011 100 101 110 11100 11101 11110
平均長度為3.12
選取3位表示7個 然后固定前3位為111 擴展2位 2的2次方就是4>3 也滿足
三、地址碼
指令中指定操作數存儲位置的字段稱為地址碼,地址碼中可以包含存儲器地址。也可包含寄存器編號。
指令中可以有一個、兩個或者三個操作數,也可沒有操作數,根據一條指令有幾個操作數地址,可將指令分為零地址指令。一地址指令、二地址指令、三地址指令。4個地址碼的指令很少被使用。
| 操作碼字段 | 地址碼 | |||
| 操作碼 | A1 | A2 | A3 | 三指令地址 |
| 操作碼 | A1 | A2 | 二指令地址 | |
| 操作碼 | A1 | 一指令地址 | ||
| 操作碼 | 零指令地址 | |||
零地址指令:只有操作碼,沒有地址碼(空操作 停止等)
一地址指令:指令編碼中只有一個地址碼,指出了參加操作的一個操作數的存儲位置,如果還有另一個操作數則隱含在累加器中
eg: INC AL
INC [S1]
二地址指令:指令編碼中有兩個地址,分別指出了參加操作的兩個操作數的存儲位置,結果存儲在其中一個地址中
(op a1,a2:a1 op a2 a1)
eg: MOV AL ,BL
ADD AL,30
三地址指令:指令編碼中有3個地址碼,指出了參加操作的兩個操作數的存儲位置和一個結果的地址
(op a1,a2,a3: a1 op a2 a3)
二地址指令格式中,從操作數的物理位置來說有可歸為三種類型
寄存器-寄存器(RR)型指令:需要多個通用寄存器或個別專用寄存器,從寄存器中取操作數,把操作結果放入另一個寄存器,機器執行寄存器-寄存器型的指令非常快,不需要訪存。
寄存器-存儲器(RS)型指令:執行此類指令時,既要訪問內存單元,又要訪問寄存器。
存儲器-存儲器(SS)型指令:操作時都是涉及內存單元,參與操作的數都是放在內存里,從內存某單元中取操作數,操作結果存放至內存另一單元中,因此機器執行指令需要多次訪問內存。
四、指令字
指令字長度:一個指令字中包含二進制代碼的位數,其長度應該與計算機的數據字長相匹配,以簡化指令訪存的操作,一般指令字長為計算機字長的整數倍。
機器字長:計算機能直接處理的二進制數據的位數,他決定了計算機的運算精度。指令字長等於機器字長稱為單字長指令。
指令字長等於兩個機器字長指令稱為雙字長指令,三字長以上指令較少使用。
使用多字長指令,目的在於提供足夠的地址位來解決訪問內存任何單元的尋址問題。
缺點:是必須兩次或多次訪問內存以取出一整條指令,降低了CPU的運算速度,又占用了更多的存儲空間。
五、操作碼的設計
操作碼的設計應當與地址碼的設計相匹配,以形成高效合理的指令編碼。
如指令長度固定的情況下,地址碼數量較多的指令可以安排較短的操作碼,地址碼數量較少的指令中可以安排較長的操作碼。
例、某計算機要求如下形式的指令:三地址指令4條,單地址指令254條,0地址指令16條,設指令字長12位每個地址碼3位,設計其編碼。
答:3地址指令 3位操作碼 9位地址碼
1地址指令 9位操作碼 3位地址碼
0地址指令12位操作碼
先設計3地址操作碼用000~011這4個編碼作為3地址指令操作碼
單地址指令地址碼是3位,操作碼最多可以9位,前3位用了4個還剩4個
一地址指令中操作碼可擴展9位 2的6次方64個
100 xxx xxx 1地址的64條 (100 000 000~100 111 111)
101 xxx xxx 1地址的64條(101 000 000~101 111 111)
110 xxx xxx 1地址的64條 (110 000 000~110 111 111)
111 xxx xxx 1地址的62條 (111 000 000~111 111 111)
剩余為111111110 0地址的8個
111111111 0地址的8個
例:計算機指令長度為20位,有2地址指令,1地址指令,0地址指令。地址碼長度為6位,問若操作碼字段固定長度為8位,先設計出m條2地址指令,n條0地址指令,此時改計算機最多可以有多少條1地址指令。
答:
操作碼(20-12=8位) 地址碼 8位 地址碼8位
因為操作碼字段固定長度為8位,1地址指令為m條,0地址指令為n條,最多可以設計出1地址指令為2的8次方-m-n條
例:某16位計算機指令格式如下所示,其中OP為操作碼,試分析指令格式的特點
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| OP | 源寄存器 | 目標寄存器 | |||||||||||||
答:單字長二地址指令
操作碼字段op可以指定128條指令(2的7次方)
源寄存器和目標寄存器都是通用寄存區(可分別指定16個通用寄存器)所以是RR型指令,兩個操作數均在寄存器中
例:16位機指令格式如下。op為操作碼字段,試分析指令格式特點
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| OP | 源寄存器 | 變址寄存器 | |||||||||||||
| 位移量(16位) | |||||||||||||||
答:雙字長(指令32位 機器16位)二地址指令,用於訪問存儲器
操作碼字段op為6位,可以指定64種操作
一個操作數在源寄存區(16個),另一個操作數在存儲器中(由變址寄存器和位移量決定)所以是RS行指令。
