目錄
4.1指令系統
4.1.1指令集體系結構
4.1.2指令的基本格式
1.零地址指令
2.一地址指令
3.二地址指令
4.三地址指令
5.四地址指令
4.1.3定長操作碼指令格式
4.1.4擴展操作碼指令格式
4.1.5指令的操作類型
1.數據傳送
2.算術和邏輯運算
3.移位操作
4.轉移操作
5.輸入輸出操作
4.2指令的尋址方式
4.2.1指令尋址和數據尋址
1.指令尋址
(1)順序尋址
(2)跳躍尋址
2.數據尋址
4.2.2常見的數據尋址方式
1.隱含尋址
2.立即(數)尋址
3.直接尋址
4.間接尋址
5.寄存器尋址
6.寄存器間接尋址
7.相對尋址
8.基址尋址
9.變址尋址
10.堆棧尋址
4.3程序的機器級代碼表示
4.3.1常用匯編指令介紹
1.相關寄存器
2.匯編指令格式
3.常用指令
(1)數據傳送指令
(2)算術和邏輯運算指令
4.3.2選擇語句的機器級表示
4.3.3循環語句的機器級表示
4.3.4過程調用的機器級表示
4.4 CISC和RISC的基本概念
4.4.1復雜指令系統計算機(CISC)
4.4.2精簡指令系統計算機(RISC)
4.4.3CISC和RISC的比較
4.5本章小結
4.1指令系統
4.1.1指令集體系結構
機器指令(簡稱指令)是指示計算機執行某種操作的命令。一臺計算機的所有指令的集合構成該機的指令系統,也稱指令集。指令系統是指令集體系結構(ISA)中最核心的部分,ISA完整定義了軟件和硬件之間的接口,是機器語言或匯編語言程序員所應熟悉的。
ISA規定的內容主要包括:
1)指令格式,指令尋址方式,操作類型,以及每種操作對應的操作數的相應規定。
2)操作數的類型,操作數尋址方式,以及是按大端方式還是按小端方式存放。
3)程序可訪問的寄存器編號、個數和位數,存儲空間的大小和編址方式。
4)指令執行過程的控制方式等,包括程序計數器、條件碼定義等。
ISA規定了機器級程序的格式,機器語言或匯編語言程序員必須對機器的ISA非常熟悉。不過,大多數程序員不會用匯編語言或機器語言編寫程序,通常用高級語言(如C/C++/Java)編寫程序,這樣開發效率更高,也不易出錯。但是,高級語言抽象層太高,隱藏了許多機器級程序的細節,使得高級語言程序員不能很好地利用與機器結構相關的一些優化方法來提升程序的性能。若程序員對ISA和底層硬件實現細節有充分的了解,則可以更好地編制高性能程序。
4.1.2指令的基本格式
一條指令就是機器語言的一個語句,它是一組有意義的二進制代碼。一條指令通常包括操作碼字段和地址碼字段兩部分:
操作碼字段 | 地址碼字段 |
其中,操作碼指出該指令應執行什么操作以及具有何種功能。操作碼是識別指令、了解指令功能及區分操作數地址內容等的關鍵信息。例如,指出是算術加運算還是算術減運算,是程序轉移還是返回操作。地址碼給出被操作的信息(指令或數據)的地址,包括參加運算的一個或多個操作數的地址、運算結果的保存地址、程序的轉移地址、被調用子程序的入口地址等。
指令字長是指一條指令所包含的二進制代碼的位數,其取決于操作碼的長度、地址碼的長度和地址碼的個數。指令字長與機器字長沒有固定的關系,它既可以等于機器字長,又可以大于或小于機器字長。通常,把指令長度等于機器字長的指令稱為單字長指令,指令長度等于半個機器字長的指令稱為半字長指令,指令長度等于兩個機器字長的指令稱為雙字長指令。
指令長度的不同會導致取指令時間開銷的不同,單字長指令只需訪存1次就能將指令完整取出;而雙字長指令則需訪存2次才能完整取出,耗費2個存取周期。
在一個指令系統中,若所有指令的長度都是相等的,則稱為定長指令字結構。定字長指令的執行速度快,控制簡單。若各種指令的長度隨指令功能而異,則稱為變長指令字結構。然而,因為主存一般是按字節編址的,所以指令字長通常為字節的整數倍。
根據指令中操作數地址碼的數目的不同,可將指令分成以下幾種格式。
◆根據指令格式及相關編碼條件組合成機器代碼
1.零地址指令
只給出操作碼OP,沒有顯式地址。這種指令有兩種可能:
1)不需要操作數的指令,如空操作指令、停機指令、關中斷指令等。
2)零地址的運算類指令僅用在堆棧計算機中。通常參與運算的兩個操作數隱含地從棧頂和次棧頂彈出,送到運算器進行運算,運算結果再隱含地壓入堆棧。
2.一地址指令
這種指令也有兩種常見的形態,要根據操作碼的含義確定究竟是哪一種。
1)只有目的操作數的單操作數指令,按A?地址讀取操作數,進行OP操作后,結果存回原地址。
指令含義:OP(A?)→A?
如操作碼含義是加1、減1、求反、求補、移位等。
2)隱含約定目的地址的雙操作數指令,按指令地址A?可讀取源操作數,指令可隱含約定另一個操作數由ACC(累加器)提供,運算結果也將存放在ACC中。
指令含義:(ACC)OP(A?)→ACC
◆地址位數與尋址范圍的關系
若指令字長為32位,操作碼占8位,1個地址碼字段占24位,則指令操作數的直接尋址范圍為22?=16M。若地址碼字段均為主存地址,則完成一條一地址指令需要3次訪存(取指令1次,取操作數1次,存結果1次)。
3.二地址指令
指令含義:(A?)OP(A?)→A?
對于常用的算術和邏輯運算指令,往往要求使用兩個操作數,需分別給出目的操作數和源操作數的地址,其中目的操作數地址還用于保存本次的運算結果。若指令字長為32位,操作碼占8位,兩個地址碼字段各占12位,則每個操作數的直接尋址范圍為212=4K。若地址碼字段均為主存地址,則完成一條二地址指令需要4次訪存(取指令1次,取兩個操作數2次,存結果1次)。
4.三地址指令
指令含義:(A?)OP(A?)→A?
若指令字長為32位,操作碼占8位,3個地址碼字段各占8位,則每個操作數的直接尋址范圍為2?=256。若地址碼字段均為主存地址,則完成一條三地址需要4次訪問存儲器(取指令1次,取兩個操作數2次,存結果1次)。
5.四地址指令
指令含義:(A?)OP(A?)→A?,A?=下一條將要執行指令的地址。
若指令字長為32位,操作碼占8位,4個地址碼字段各占6位,則每個操作數的直接尋址范圍為2?=64。若地址碼字段均為主存地址,則完成一條四地址指令需要4次訪存(取指令1次,取兩個操作數2次,存結果1次)。
4.1.3定長操作碼指令格式
命題追定長操作碼的指令條數(2015)
定長操作碼指令在指令字的最高位部分分配固定的若干位(定長)表示操作碼。一般n位操作碼字段的指令系統最大能夠表示2”條指令。定長操作碼對于簡化計算機硬件設計,提高指令譯碼和識別速度很有利。當計算機字長為32位或更長時,這是常規用法。
4.1.4擴展操作碼指令格式
◆擴展操作碼的設計與分析
為了在指令字長有限的前提下仍保持比較豐富的指令種類,可采取可變長度操作碼,即全部指令的操作碼字段的位數不固定,且分散地放在指令字的不同位置上。顯然,這將增加指令譯碼和分析的難度,使控制器的設計復雜化。最常見的變長操作碼方法是擴展操作碼,它使操作碼的長度隨地址碼的減少而增加,不同地址數的指令可具有不同長度的操作碼,從而在滿足需要的前提下,有效地縮短指令字長。圖4.1所示即為一種擴展操作碼的安排方式。
在圖4.1中,指令字長為16位,其中4位為基本操作碼字段OP,另有3個4位長的地址字段A?、A?和A?。4位基本操作碼若全部用于三地址指令,則有16條。圖4.1中所示的三地址指令為15條,1111留作擴展操作碼之用;二地址指令為15條,11111111留作擴展操作碼之用;一地址指令為15條,111111111111留作擴展操作碼之用;零地址指令為16條。
除這種安排外,還有其他多種擴展方法,如形成15條三地址指令、12條二地址指令、63條一地址指令和16條零地址指令,共106條指令,請讀者自行分析。在設計擴展操作碼指令格式時,必須注意以下兩點:
1)不允許短碼是長碼的前綴,即短操作碼不能與長操作碼的前面部分的代碼相同。
2)各指令的操作碼一定不能重復。
通常情況下,對使用頻率較高的指令分配較短的操作碼,對使用頻率較低的指令分配較長的操作碼,從而盡可能減少指令譯碼和分析的時間。
4.1.5指令的操作類型
設計指令系統時必須考慮應提供哪些操作類型,指令操作類型按功能可分為以下幾種。
1.數據傳送
傳送指令通常有寄存器之間的傳送(MOV)、從內存單元讀取數據到CPU寄存器(LOAD)、從CPU寄存器寫數據到內存單元(STORE)、進棧操作(PUSH)、出棧操作(POP)等。
2.算術和邏輯運算
這類指令主要有加(ADD)、減(SUB)、乘(MUL)、除(DIV)、加1(INC)、減1(DEC)、與(AND)、或(OR)、取反(NOT)、異或(XOR)等。
3.移位操作
移位指令主要有算術移位、邏輯移位、循環移位等。
4.轉移操作
◆轉跳指令、調用和返回指令、條件轉移指令的區分
轉移指令主要有無條件轉移(JMP)、條件轉移(BRANCH)、調用(CALL)、返回(RET)、陷阱(TRAP)等。無條件轉移指令在任何情況下都執行轉移操作,而條件轉移指令僅在特定條件滿足時才執行轉移操作,轉移條件一般是某個標志位的值,或幾個標志位的組合。調用指令和轉移指令的區別:執行調用指令時必須保存下一條指令的地址(返回地址),當子程序執行結束時,根據返回地址返回到主程序繼續執行;而轉移指令則不返回執行。
5.輸入輸出操作
這類指令用于完成CPU與外部設備交換數據或傳送控制命令及狀態信息。