指令
又稱機器指令,是指示計算機執行某種操作的命令,是計算機運行的最小功能單位。
一台計算機的所有指令的集合構成該機的指令系統,也稱位指令集。
指令格式
一條指令就是機器語言的一個語句,它是一組由有意義的二進制代碼。
一條指令通常要包括操作碼和字段和地址碼字段兩部分:
操作碼(OP) | 地址碼(A) |
---|
地址碼
設指令字長及存儲字長均為32位,操作碼占8位
零地址指令:
OP |
---|
指令含義:
-
不需要操作數,如空操作、停機、關中斷等指令。
-
堆棧計算機,兩個操作數隱含存放在棧頂和次棧頂,計算結果壓回棧頂。
一地址指令:
OP | A1 |
---|
指令含義:
-
\(OP(A_1)->A_1\),如加1、減1、取反、求補等;完成一條指令需要訪存3次。
-
\((ACC)OP(A_1)->ACC\),隱含約定的目的地址為ACC;完成一條指令需要訪存2次。
1個地址碼字段占24位,指令操作數直接尋址范圍位\(2^{24}=16M\)。
二地址指令:
OP | A1(目的操作數) | A2(源操作數) |
---|
指令含義:\((A_1)OP(A_2)->A_1\)
2個地址碼字段各占12位,指令操作數直接尋址范圍為\(2^{12}=4K\);完成一條指令需要訪存4次。
三地址指令:
OP | A1 | A2 | A3(結果) |
---|
指令含義:\((A_1)OP(A_2)->A_3\)
3個地址碼字段各占8位,指令操作數直接尋址范圍為\(2^8=256\),完成一條指令需要訪存4次。
四地址指令:
OP | A1 | A2 | A3(結果) | A4(下址) |
---|
指令含義:\((A_1)OP(A_2)->A_3\),\(A_4\)=下一條將要執行指令的地址
4個地址碼字段各占6位,指令操作數直接尋址范圍為\(2^6=64\),完成一條指令需要訪存4次。
將PC的值直接修改為\(A_4\)所指地址
定長指令字結構:指令長度固定
變長指令字結構:指令長度不等
操作碼
操作碼指出指令中該指令應該執行什么性質的操作和具有何種功能。
操作碼是識別指令、了解指令功能與區分操作數地址內容的組成和使用方法等的關鍵信息。例如:指出是算術加運算,還是減運算,是程序轉移,還是返回操作。
定長操作碼:在指令字的最高位部分分配固定的若干位(定長)表示操作碼。
- 一般n位操作碼字段的指令系統最大能夠表示\(2^n\)條指令。
- 優點:定長操作碼對於簡化計算機硬件設計,提高指令譯碼和識別速度很有利。
- 缺點:指令數量增加時回占用更多固定為,留給表示操作數地址的位數有限。
擴展操作碼指令格式
定長指令字+可變長操作碼——>擴展操作碼指令格式
在設計擴展操作碼指令格式時,必須注意以下兩點:
- 不允許短碼是長碼的前綴,即短操作碼不能與長操作碼的前面部分的代碼相同
- 各指令的操作碼一定不能重復
通常情況下,對使用頻率較高的指令,分配較短的操作碼;對使用頻率較低的指令,分配較長的操作碼,從而盡可能減少指令譯碼和分析的時間。
擴展操作碼(不定長操作碼):全部指令的操作碼字段的位數不固定,且分散地放在指令字的不同位置上。
- 最常見的變長操作碼方法時擴展操作碼,使操作碼的長度隨地址碼的減少而增加,不同地址碼的指令可以具有不同長度的操作碼,從而在滿足需要的前提下,有效地縮短指令字長。
- 優:在指令字長有限的前提下仍保持比較豐富的指令種類。
- 缺:增加了指令譯碼和分析的難度,使控制器的設計復雜化。
操作類型
數據傳送
LOAD 作用:把存儲器(源)中的數據放到寄存器(目的)中
STORE 作用:把寄存器(源)中的數據放到存儲器(目的)中
算術邏輯操作
算術:加、減、乘、除、增1、減1、求補、浮點運算、十進制運算
邏輯:與、或、非、異或、位操作、位測試、位清除、位求反
移位操作
算術移位、邏輯移位、循環移位(帶進位和不帶進位)
轉移操作
無條件轉移 JMP
條件轉移 JZ:結果為0;JO:結果溢出;JC:結果有進位
調用和返回 CALL和RETURN
陷阱(Trap)和陷阱指令
輸入輸出操作
CPU寄存器與IO端口之間的數據傳送(端口即I/O接口的寄存器)
擴展操作碼指令格式
指令尋址
三個字長:
機器字長:CPU一次能處理的二進制數據的位數
指令字長:一個指令字中包含二進制代碼的位數
存儲字長:一個存儲單元存儲二進制代碼的長度
單字長指令:指令長度=機器字長
半字長指令:指令長度=機器字長的一半
雙字長指令:指令長度=機器字長的兩倍
指令尋址
下一條欲執行指令的指令地址 (始終由程序計數器PC給出)
順序尋址:(PC) + “1”(1個指令字長)->PC
跳躍尋址:由轉移指令指出
數據尋址
操作碼(OP) | 尋址特征 | 尋址地址(A) |
---|
隱含尋址
不是明顯地給出操作數的地址,而是在指令中隱含着操作數的地址。
優點:有利於縮短指令字長。
缺點:需增加存儲操作數或隱含地址的硬件。
立即尋址
形式地址A就是操作數本身,又稱為立即數,一般采用補碼形式
(#表示立即尋址特征)
優點:指令執行階段不訪問主存,指令執行時間最短
缺點:A的位數限制了立即數的范圍。
如A的位數為n,且立即數采用補碼時,可表示的數據范圍為\(-2^{n-1}\)~$ 2^{n-1}-1$
直接尋址
指令字中的形式地址A就是操作數的真實地址EA,即EA=A
優點:簡單,指令執行階段僅訪問一次主存,不需專門計算操作數的地址。
缺點:A的位數決定了該指令操作數的尋址范圍。操作數的地址不易修改。
間接尋址
指令的地址字段給出的形式地址不是操作數的真正地址,而是操作數有效地址所在的存儲單元的地址,也就是操作數地址,即EA=(A)。
優點:可擴大尋址范圍(有效地址EA的位數大於形式A的位數)。便於編制程序(用間接尋址可以方便地完成子程序返回)。
缺點:指令在執行階段要多次訪存(一次間址需兩次訪存,多次尋址需根據存儲子的最高位確定幾次訪存)。
寄存器尋址
在指令字中直接給出操作數所在的寄存器編號,即\(EA=R_i\),其操作數在由\(R_i\)所指的寄存器內。
優點:指令在執行階段不訪問主存,只放問寄存器,指令字且執行速度快,支持向量/矩陣運算。
缺點:寄存器價格昂貴,計算機寄存器個數有限。
寄存器間接尋址
寄存器\(R_i\)中給出的不是一個操作數,而是操作數所在主存單元的地址,即\(EA=(R_i)\) 。
特點:與一般間接尋址相比速度更快,但指令的執行階段需要訪問主存(因為操作數在主存中)。
基址尋址
將CPU中基址寄存器(BR)的內容加上指令格式中的形式地址A,而形成操作數的有效地址,即EA=(BR)+A。
采用專用寄存器BR作為基址寄存器:
采用通用寄存器BR作為基址寄存器:
注:基址寄存器是面向操作系統的,其內容由操作系統或管理程序確定。在程序執行過程中,基址寄存器的內容不變(作為基地址),形式地址可變(作為偏移量)。
當采用通用寄存器作為基址寄存器時,可由用戶決定哪個寄存器作為基址寄存器,但其內容仍由操作系統確定。
優點:可擴大尋址范圍(基址寄存器的位數大於形式地址A的位數);用戶不必考慮自己的程序存於主存的哪一空間區域,故有利於多道程序設計,以及可用於編制浮動程序。
變址尋址
有效地址EA等於指令字中的形式地A與變址寄存器IX的內容相加之和,即EA=(IX)+A,其中IX為變址寄存器(專用),也可用通用寄存器作為變址寄存器。
注:變址寄存器時面向用戶的,在程序執行過程中,變址寄存器可由用戶改變(作為偏移量),形式地址A不變(作為基地址)。
優點:可擴大尋址范圍(變址寄存器的位數大於形式地址A的位數);在數組處理過程中,可設定A為數組的首地址,不斷改變變址寄存器IX的內容,便可很容易形成數組中任一數據的地址,特別適合編制循環程序。
基址&變址復合尋址
先基址后變址尋址:EA=(IX)+((BR)+A)
相對尋址
把程序計數器PC的內容加上指令格式的形式地址A而形成操作數的有效地址,即EA=(PC)+A,其中A是相對於PC所指地址的位移量,可正可負,補碼表示。
優點:操作數的地址不是固定的,它隨着PC值的變化而變化,並且與指令地址之間總是相差一個固定值,因此便於程序浮動。
相對尋址廣泛應用於轉移指令。
堆棧尋址
操作數存放在堆棧中,隱含使用堆棧指針(SP)作為操作數地址。
堆棧是存儲器(或專用寄存器組)中一塊特定的按"后進先出(LIFO)"原則管理的存儲區,該存儲區中讀/寫單元的地址是用一個特定的寄存器給出的,該寄存器稱為堆棧指針(SP)。
用寄存器組實現的堆棧稱為硬堆棧;用存儲器實現的堆棧稱為軟堆棧。
堆棧可用於函數調用時保持當前函數的相關信息。
CISC和RISC
CISC
Complex Instruction Set Computer
設計思路:一條指令完成一個復雜的基本功能。
代表:x86架構,主要用於筆記本、台式機等
80-20規律:典型程序中80%的語句僅僅使用處理機中20%的指令。
RISC
Reduced Instruction Set Computer
設計思路:一條指令完成一個基本"動作";多條指令組合完成一個復雜的基本功能。
代表:ARM架構,主要用於手機、平板等。
對比
對比項目類型 | CISC | RISC |
指令系統 | 復雜,龐大 | 簡單,精簡 |
指令數目 | 一般大於200條 | 一般小於100條 |
指令字長 | 不固定 | 定長 |
可訪存指令 | 不加限制 | 只有Load/Store指令 |
各種指令執行時間 | 相差較大 | 絕大多數在一個周期內完成 |
各種指令使用頻度 | 相差很大 | 都比較常用 |
通用寄存器數量 | 較少 | 多 |
目標代碼 | 難以用優化編譯生成高效的目標代碼 | 采用優化的編譯程序,生成代碼較為高效 |
控制方式 | 絕大多數為微程序控制 | 絕大多數為組合邏輯控制 |
指令流水線 | 可以通過一定方式實現 | 必須實現 |