指令
OP(操作碼) | A(指令存放地址) |
---|
- 指令由操作碼和若干個地址碼組成。
- 定長指令字結構(指令總長度不變)的指令系統中所有指令的長度都相等
- 變長指令字結構(指令總長度需要改變)的指令系統中各種指令的長度不等
指令操作碼OP
操作碼指出指令中該指令應該執行什么性質的操作和具有何種功能。
操作碼是識別指令、了解指令功能與區分操作數地址內容的組成和使用方法等的關鍵信息。
- 定長操作碼指令系統中所有指令的操作碼長度都相同
- 可變長操作碼指令系統中各指令的操作碼長度可變
操作碼分類:
- 定長操作碼:在指令字的最高位部分分配固定的若干位(定長)表示操作碼。
- 一般n位操作碼字段的指令系統最大能夠表示 2^n 條指令。
- 優:定長操對於簡化計算機硬件設計,提高指令譯碼和識別速度很有利;
- 缺:指令數量增加時會占用更多固定位,留給表示操作數地址的位數受限。
- 擴展操作碼(不定長操作碼):全部指令的操作碼字段的位數不固定,且分散地放在指令字的不同位置上。
- 最常見的變長操作碼方法是擴展操作碼,使操作碼的長度隨地址碼的減少而增加,不同地址數的指令可以具有不同長度的操作碼,從而在滿足需要的前提下,有效地縮短指令字長。
- 優:在指令字長有限的前提下仍保持比較豐富的指令種類;
- 缺:增加了指令譯碼和分析的難度,使控制器的設計復雜化。
例:某三地址指令
- 某三地址指令:當指令字長為16位,每個地址碼占4位。
- 則前四位為基本操作碼字段OP,另外三個4位長的地址字段A1、A2、A3。
- 4位基本操作碼若全部用於三地址指令,則有2^4=16條
OP | A1 | A2 | A3 |
---|
拓展操作碼
- 定長指令字結構+可變長操作碼 = 擴展操作碼指令格式
- 三地址指令,我們有16個,但是只用15個,然后留下1111作為其他類型的開頭
- 二地址指令,我們有16個,但是只用15個,然后留下1111 1111作為其他類型的開頭
- 一地址指令,我們有16個,但是只用15個,然后留下1111 1111 1111作為其他類型的開頭
- 零地址指令,我們有 1 X 2^4 = 16個。
設計擴展操作碼指令格式時注意點
對比哈夫曼樹“前綴編碼”
- 不允許短碼是長碼的前綴,即短操作碼不能與長操作碼的前面部分的代碼相同。
- 各指令的操作碼一定不能重復。
注:通常情況下,
- 對使用頻率較高的指令,分配較短的操作碼;例如三地址指令。
- 對使用頻率較低的指令,分配較長的操作碼,從而盡可能減少指令譯碼和分析的時間。
設計例題
設指令字長固定為16位,試設計一套指令系統滿足:
- a) 有15條三地址指令
- b) 有12條二地址指令
- c) 有62條一地址指令
- d) 有32條零地址指令
- a) 有15條三地址指令,共2^4種,留出1種,選擇0000-1110,共15個,給后輩留下1111
- b) 有12條二地址指令,共1 X 2^4 種,留出 16 - 12 = 4 種
- c) 有62條一地址指令,共4 X 2^4 種,留出 64 - 62 = 2 種。1100 - 1110 有三段,搭配0000-1111,即16*3 = 48
- d) 有32條零地址指令,共2 X 2^4 種,即一個不留,就是32種。
CPU如何判斷是幾地址指令?
- CPU一次性讀入16bit,然后判斷前四位,不是全1,就是三地址指令, 然后依次判斷二地址、一地址、零地址