文章目錄
指令系統概述
指令:控制計算機執行某種操作(加減乘除等)的命令
指令系統:計算機中所有指令的集合
指令通常包括以下內容:
- 具體做什麼操作
- 操作對象的來源
- 操作結果的存放位置
指令系統是計算機系統性能的集中體現,是計算機軟硬件系統的設計基礎,一方面,硬件設計者要根據指令系統進行硬件的邏輯設計,另一方面,軟件設計者也要根據指令系統來建立計算機的系統軟件,如何表示指令,如何構建指令系統,直接影響計算機系統的軟硬件功能,一個完善的指令系統應該滿足下面4方面的要求:
-
完備性
編程時,指令系統直接提供的指令足夠使用,不必用軟件實現,即要求指令種類齊全,使用方便 -
有效性
用指令編寫的程序能高效運行,佔用資源少 -
規整性
規整性包括三個方面- 對稱性:衡量指令對各種尋址方式的支持,即指令能同等對待存儲器/寄存器,指令能使用各種尋址方式
- 均齊性:衡量指令對各種數據類型的支持
- 一致性:指的是指令長度與數據長度的關係,通常是字節的整數倍
-
兼容性
機器上運行的程序,無需修改或者少量修改就能在另一臺計算機運行
指令格式
指令是計算機中傳輸控制信息的載體,每條指令代表某個基本的信息處理操作及操作的對象
一般的指令格式:
操作碼 + 操作數地址碼
操作碼
操作碼用來表示具體的操作性質,不同功能的指令其操作碼編碼不同
操作碼又可分爲兩種:
- 固定長度操作碼:不僅操作碼長度固定,而且在指令中的位置也固定
- 可變長操作碼:操作碼長度不固定,在指令中的位置也不固定
地址碼
地址碼字段的作用隨指令類型和尋址方式不同而不同,根據一條指令中所包含的操作數地址數量,可以分爲四種:
- 三地址指令
兩個操作數進行某種運算,其結果放入第三個操作數 - 雙地址指令
兩個操作數進行某種運算,其結果放回其中的一個操作數中 - 單地址指令
- 單目運算符,如求反操作
- 將另一個操作數隱含於某個寄存器
- 零地址指令
- 操作不需要地址,如NOP,WAIT等
- 需要一個操作數,但是隱含於某個寄存器
- 需要兩個操作數,但是都位於堆棧中
指令長度
指令長度是指指令的二進制位數,可以分爲:
- 半字長指令
指令字長等於半個機器字長,每個存儲單元可以存放兩條指令 - 但字長指令
指令字長等於一個機器字長,每個存儲單元可以存放一條指令 - 多字長指令
指令字長等於多個機器字長,多個存儲單元存放一條指令
指令和操作數的尋址方式
尋址方式:尋找指令或操作數有效地址的方法
運行程序之前,必須將指令和數據存放到主存中,主存是基於地址訪問的存儲器,只有獲得相應的地址,CPU纔可以訪問到主存中對應的內容
指令的尋址方式
順序尋址
順序尋址:程序中的指令序列往往是順序存放,如果知道第一條指令的地址,很容易得到下一條指令的地址
CPU用程序計數器PC保存下一條將被執行的指令地址,每執行一條指令,PC值自動加1,得到下一條指令的地址,這裏的加1,是指加一條指令佔用的存儲單元數,如32位系統中,一條指令4字節,因此按字節編址的情況下,實際是加4
跳躍尋址
當程序中出現分支或轉移時,會改變程序執行順序,這時採用跳躍尋址,下一條指令地址通過PC加上一個偏移值得到
操作數尋址方式
操作數尋址方式:形成操作數有效地址的方法
單地址指令結構:操作碼 OP+ 尋址方式特徵碼 I + 形式地址 D
立即數尋址
此時尋址方式特徵碼指示爲立即尋址,形式地址D是操作數本身,這個立即數作爲指令的一部分與指令一起存放在主存單元,取指令時送到指令寄存器中
特點:指令執行速度快,但是受指令所分配的位數限制,不能表示太大的數
直接尋址
直接尋址:指令的地址碼字段直接作爲操作數地址
此時特徵碼指出直接尋址方式,形式地址給出操作數的地址
特點:地址直觀,不需要通過計算就可以直接獲取到操作數地址,但是受位數限制,尋址範圍受限,不能表示太大的地址,數據地址改變時,程序也要改變,編程不變
間接尋址
特徵碼指出間接尋址方式,地址碼字段中的形式地址給出操作數地址的地址,因此D只是一個間接地址
特點:解決直接尋址範圍受限問題,用較短的地址碼訪問較大的主存空間
寄存器尋址
寄存器尋址:操作數在CPU內的某個通用寄存器中
這種方式下,取操作數不需要訪問主存,因此形式地址字段不表示主存地址,而是通用寄存器號
特點:不需要訪問主存,指令執行速度快,所需的地址碼短,指令長度可以縮短,節省內存空間
寄存器間接尋址
操作數的地址存放在寄存器中,指令的形式地址字段D給出的是寄存器號,以對應寄存器的內容爲地址訪問主存單元,得到操作數
特點:訪問一次寄存器和一次內存,相對於間接尋址訪問兩次內存,速度更快,所有既能擴展尋址範圍,又不增加訪問主存的次數
相對尋址
相對尋址:把程序計數器PC的內容加上指令中形式地址D,形成操作數的有效地址
特點:編程只要確定程序內部操作數與指令的相對距離,而無需確定操作數在主存中的絕對地址,便於實現程序浮動
變址尋址
用一個寄存器存放變化的地址,這個寄存器稱爲變址寄存器,同時用指令的形式地址字段存放一個偏移值,變址寄存器的內容與指令中形式地址D之和即爲操作數的有效地址
一般情況下,變址寄存器的內容每次操作後都會改變,而指令中的偏移量是不變的
對於某些指令,變址寄存器是隱含的,例如(SI 和 DI 寄存器),如果採用通用寄存器作爲變址寄存器,則需要顯式地指定
變址尋址一般用於對數組之類的線性數據訪問
基址尋址
用一個寄存器存放基地址,這個寄存器稱爲基址寄存器,同時用指令的形式地址字段存放變化的地址值,基址寄存器的內容與形式地址D之和即爲操作數據的有效地址
一般情況下,基址寄存器的內容不變,形式地址字段的內容一直變化,正好與變址尋址相反
CPU內部有專門的基址寄存器(BX 和 BP),因此基址寄存器將會隱藏,如果採用通用寄存器作爲基址寄存器,則需要指令中指出
和變址尋址的對比
- 基址尋址面向系統,主要用於程序的重定位
- 變址尋址面向用戶,主要解決程序循環問題
堆棧尋址
堆棧以先進後出的方式存儲數據,尋找存放在堆棧中的操作數地址的方法稱爲堆棧尋址
在內存中設置一個堆棧基地址,設置一個棧頂指針SP,即可形成堆棧空間
其它尋址
複合尋址
複合尋址是幾種尋址方式的組合,主要用於複雜指令集結構計算機
- 變址尋址 + 間接尋址
- 間接尋址 + 變址尋址
- 相對尋址 + 間接尋址
段尋址
段尋址是爲了擴大尋址範圍,參考8086彙編
分頁尋址
爲了解決直接尋址中,受位數限制,尋址訪問有限的問題
將內存分頁,頁號提前送入,尋址時,將頁號與形式地址進行組合
指令系統類型
一個完善的指令系統應該包括的基本指令有:
-
數據傳送指令
數據傳送指令是計算機中最基本最常用的指令,主要用於兩個部件之間的數據傳送 -
算數邏輯運算指令
進行各類數據信息處理,包括各種算數運算以及邏輯運算 -
移位操作指令
分爲算數移位,邏輯移位,循環移位,對操作數進行移動 -
堆棧操作指令
堆棧操作主要是入棧和出棧,用於保存和恢復中斷和子程序調用時現場數據和指令地址,以及子程序調用的參數傳遞等 -
字符串處理指令
屬於非數值處理指令,便於直接用硬件支持非數值處理,一般包括字符串傳送,字符串比較,字符串查找,字符串抽取,字符串替換等 -
程序控制指令
用於控制程序運行的順序和選擇程序的運行方向,主要包括轉移指令,循環控制指令,子程序調用與返回指令 -
陷阱指令
陷阱是由於意外事故而導致程序執行中斷,發生這類時間將導致計算機無法正常工作,必須採取措施 -
輸入輸出指令
簡稱IO指令,用於主機與外部之間的數據輸入輸出,主機向外設發出各種控制命令 -
其它指令
NOP,WAIT等
指令格式設計及優化
指令格式的設計
指令一般由操作碼和地址碼組成,指令格式的設計首先要確定指令的編碼格式,在此基礎上還要確定操作碼字段和地址碼字段的大小和組合形式,以及各種尋址方式的編碼
指令編碼格式的設計
指令的編碼格式設計就是要確定指令是採用定長指令結構,變長指令結構,還是混合結構
- 定長指令格式
指令系統中,各種類型指令長度都相等,結構規整,有利於簡化硬件,但是容易出現冗餘碼點,指令不易拓展 - 變長指令格式
指令字的長度隨功能的不同而不同,結構靈活,指令碼點冗餘少,易於拓展,但是格式不規整,會導致控制複雜 - 混合編碼指令格式
是定長與變量的綜合,提供若干長度固定的指令字
操作碼的設計
滿足完備性是操作碼設計的基本要求,還要確認操作碼採用定長結構還是變長結構
地址碼的設計
地址碼要能爲指令提供必要的操作數,還要滿足指令系統的有效性和規整性
尋址方式的設計
一般將尋址方式單獨編碼,分配一個尋址方式字段
指令格式的優化
指令格式的優化設計的目的
- 節省程序的存儲空間
- 指令格式要儘量規整,以減少硬件譯碼的複雜程度
- 不能降低指令的執行速度
操作碼優化
定長結構的操作碼雖然規整,譯碼簡單,但是冗餘嚴重,因此可以縮短長度,降低冗餘,主要有以下兩種方法
huffman編碼
將發生概率最高的指令,用最短的位數表示,出現概率較低的,用較長的位數表示
設某計算機指令系統中有n種不同的指令,第i種操作碼在程序種出現的概況爲pi,則編碼步驟爲
- 把所有指令按照操作碼出現的概率從低到高的次序自左向右排列
- 選取兩個概率最小的節點合併成一個概率值是兩者之和的新節點,並把這個新節點與其它還沒有合併的節點一起組成新節點集合,並按合併後的概率重新排序
- 在新結點集合種選取兩個概率最小的節點進行合併,如此繼續,直到全部節點合併完畢
- 最後得到的根節點概率爲1
- 每個節點都有兩個分支,分別用0和1表示
- 從根節點開始,逐級下移,到達屬於每條指令的概率節點,把沿線所經過的代碼組合起來,得到相應指令的操作碼編碼
擴展編碼
huffman操作碼的主要缺點是長度不規整,硬件譯碼困難,與地址碼共同組成固定長的指令比較困難,擴展編碼就是爲了解決上述問題
-
等長擴展
每次擴展位數相同,根據選擇位數不同,等長擴展也有很多不同的方法 -
不等長擴展
每次擴展位數不同
基於地址碼擴展的操作碼優化
通常在指令中用一個固定長度的操作碼字段對基本的指令進行編碼,對於不需要地址字段的指令,可以把操作碼擴展到地址碼字段
地址碼優化方法
地址碼優化的根本目的是縮短地址碼長度,用一個較短的地址碼錶示同一個較大的邏輯地址空間
- 間接尋址方式:在存儲器低端開闢一個區域,將實際的地址存入,實現縮短地址碼的目的
- 偏移尋址方式:由於局部性原理,使用偏移量位數可以比較短
- 寄存器間接尋址:寄存器中存放實際地址,但是缺點是寄存器數量比較少
CISC和RISC的基本概念
複雜指令集計算機CISC
- 指令系統複雜龐大,指令數目一般多達兩三百條
- 尋址方式多
- 指令格式多
- 指令字長不固定
- 訪存指令不加限制
- 各種指令使用頻率相差大
- 各種指令執行時間相差大
- 大多數採用微程序控制器
精簡指令集計算機RISC
CISC典型程序中,80%的程序只用到了20%的指令集,因此提出RISC
針對CISC指令系統種類太多,指令格式不規範,尋址方式太多的缺點,減少指令種類,簡化尋址方式,方便處理器內部的並行處理,從而大幅提高CPU性能
特點:
- 選取使用頻率高的指令,避免使用複雜指令
- 大多數指令在一個機器週期內完成
- 採用load/store結構,儘量減少主存訪問
- 採用簡單的指令格式和尋址方式,指令長度固定
- 固定的指令格式,可簡化指令的譯碼邏輯
- 面向寄存器的結構,爲減少訪問內存,CPU內設置大量寄存器
- 採用硬佈線控制邏輯
- 注重編譯的優化