第四章-指令系統



title: 第4章-指令系統
date: 2020-10-12 21:34:17
tags:


指令系統

機器指令

基本概念

machine language instructions directly control a computer's central processing unit (CPU). Each instruction causes the CPU to perform a very specific task, such as a load, a store, a jump, or an arithmetic logic unit (ALU) operation on one or more units of data in the CPU's registers or memory.

機器指令直接控制着CPU的行為。每一條指令將會使得CPU實現一個任務,例如:一次載入,一次存儲,一次跳轉,或者對寄存器或者內存中數據的一次ALU的操作。

指令格式

基本格式

image-20200930091952145

操作碼

操作碼:指明該指令所要完成的操作。

  • 長度固定的操作碼便於硬件設計,指令譯碼時間段,廣泛應用於字長較長的,大中型計算機和超級小型計算機以及ROSC中。
  • 長度不固定的操作碼,其操作碼分散在指令字的不同字段中,這種格式可有效地壓縮操作碼的平均長度,在字長較短的微型計算機中被廣泛使用。

擴展操作碼技術

操作碼長度不固定會增加指令譯碼以及分析的難度。一般采用擴展操作碼技術實現長度不固定的操作碼。

實現:使操作碼的長度對地址數的減少而增加,可以將不同地址數的操作碼進行合理分配。

Eg:

如下圖,使得字長為16位的指令,可以表明61條指令。有效的壓縮了指令字長,又實現了譯碼的簡單化。

image-20200930094222903

值得注意的一點是:

  • n地址碼減少一種,n+1地址碼就會增加 2地址字長 種。

地址碼

地址碼:該指令的源操作數的地址,結果的地址,下一條指令的地址。

地址的類型可以是主存地址,可以是寄存器地址,甚至是I/O設備的地址。

四指令地址

image-20200930095942039

三指令地址

image-20200930100008288

二指令地址

image-20200930100035970

一指令地址

image-20200930100054993

無指令地址

有些指令不需要操作數(eg:空操作,停機),或者操作數已經由該指令隱含表示(eg:程序返回,中斷返回)。

當用一些硬件資源承擔指令字中需要指明的地址碼,可以在不改變指令字長的前提下,擴大指令操作數的尋址范圍。

使用一些硬件資源來進行數據的存儲,可減少訪存次數。

當然了二者都可以縮短指令字長。

操作數與操作種類

操作數類型與表示

操作數類型(數據結構):面向應用、面向軟件系統所處理的各種數據結構。 一般有:無符號整數,定點數,浮點數,ASCII,圖,樹,表等等。

操作數表示(數據表示):硬件結構能夠識別、指令系統可以直接調用的那 些結構。一般有:無符號整數,浮點數,定點數等等。

一般而言,操作數表示是操作數類型的一個子集。

確定操作數表示實際上也是軟硬件取舍折衷的問題。

  • 一旦存在一個操作數表示,必然需要硬件可以支持對於該操作數的操作。
  • 計算機即使只具有最簡單的操作數表示,如只有整數 (定點)表示法,也可以通過軟件方法處理各種復雜 的操作數類型,但是這樣會大大降低系統的效率。
  • 如果各種復雜的操作數類型均包含在操作數表示之中, 無疑會大大提高系統的效率,但是所花費的硬件代價也很高。

在計算機中,所有的數據都是以01字符串的形式進行表示,對於某個01字符串的類型確定一般取決於指令中操作碼的種類。

也可以直接給數據添加標識(flag),雖然說這種方法有許多優點,但是需要在程序執行過程中,動態地檢測標識符,動態開銷比較大,因而就放棄了這種問題。

數據在存儲器中的存放方式

邊界對准存放方式

該存放方式的形式如下圖

  • 如果需要尋求某個長度的數據存儲,可以依據地址的某尾0的個數進行判斷。eg:雙字的地址是8的整數倍,那么其起始地址的后三位必須為0.

image-20200930102953299

邊界未對准存放方式

該存放方式的形式如下圖

  • 該存放方式對於字長較長的數據進行存取時,需要讀取兩次存儲器,而后還需要對高低字節的位置進行調整,才能求得相應的數據,如下圖的陰影部分的數據。

image-20200930103357333

比較

  • 邊界對准存放方式較為直觀,而且存取較為簡單

  • 邊界未對准存放方式會充分利用存儲器空間,但存放較大規模數據較為復雜。

操作類型

數據傳送

寄存器 寄存器 存儲器 存儲器
目的 寄存器 存儲器 寄存器 存儲器
Eg MOVE STORE,MOVE,PUSH LOAD,MOVE,POP MOVE

MOVE指令根據后綴進行判斷存儲源位置以及目的位置類型。

算法邏輯

  • 算數操作:加、減、乘、除、增 1、減 1、求補、浮點運算、十進制運算
  • 邏輯操作:與、或、非、異或、
  • 位操作:位測試、位清除、位求反........

移位

算數移位,邏輯移位,循環移位(帶進位和不帶進位)

轉移

  • 無條件移位,Eg:JMP
  • 條件移位,Eg:JZ(結果為0跳轉), JO(結果溢出跳轉), JC(結果有進位跳轉), SKP(跳過一條指令)
  • 調用與返回。
  • 陷阱(意外事故的中斷)。

輸入輸出

  • 由端口地址到CPU寄存器

  • 由CPU寄存器到端口地址

尋址方式

數據尋址:確定本條指令的操作數地址

指令尋址:確定下一條欲執行指令的指令地址

下面主要介紹數據尋址的尋址方式。

一般而言,指令的地址碼字段都不代表操作數的真實地址,而一般稱其為形式地址,記作A,而其真實地址為EA,EA由尋址方式與形式地址共同確定。

image-20200930110310308

對於尋址方式的總結

image-20200930150853609

image-20201010081020089image-20201010081035703

立即數尋址

直接將操作數本身放在形式地址的位置,即形式地址A就是操作數本身,采用補碼進行存放。

其尋址特征一般為‘#’。

  • 只要取出指令,便可立即獲得操作數,不必訪問存儲器。
  • 形式地址A的位數限制了所能表示立即數的范圍
image-20200930110817190

直接尋址

形式地址A 就是操作數的真實地址EA。

  • 執行階段訪問一次存儲器
  • A的位數決定了該指令操作數的尋址方位
  • 操作數的地址不易修改
image-20200930110839643

隱含尋址

操作數的地址不顯式地給出,而是隱含在操作碼或者某個寄存器中。一般而言,其隱含的地址為某個寄存器的地址。

  • 指令字中少了一個地址字段,可縮短指令字長

image-20200930111154647

間接尋址

形式地址是:操作數的有效地址所在的存儲器單元地址。

  • 執行指令階段需要2次訪存,指令執行時間較長。
  • 擴大尋址范圍,A的位數通常會小於指令字長,而指令字長等於存儲字長。
  • 便於編制程序,使用簡潔尋址便於處理子程序返回的問題,當主程序調用多次某一子程序時,每次調用僅僅需要修改操作數即可,不必改變指令內容。

image-20200930111410545

寄存器尋址

形式地址是:寄存器的地址,該寄存器中存放操作數。也就是該指令將使用寄存器進行數據的存儲。

  • 執行階段不需要訪存,只訪問寄存器,執行速度較快
  • 寄存器個數有限,可縮短指令字長
image-20200930111832577

寄存器間接尋址

形式地址是:寄存器的地址,該寄存器中存放操作數的有效地址所在的存儲器單元地址。

  • 較間接尋址少訪問存儲一次。
  • 具備間接尋址的優點。

image-20200930112326911

基址尋址

基址尋址需設有基址寄存器,其操作數的有效地址為:形式地址與基址寄存器的地址(基地址)相加。

  • 基址尋址有利於擴大操作數的尋址范圍。因為基址寄存器的地址可以大於形式地址的位數,二者相加可以有效擴大操作數的尋址范圍。例如:將主存空間分成若干段,每段首地址存於基址寄存器內,段內的位移量由形式地址給出。
  • 基址尋址在多道程序中極為有用。用戶不必考慮自己的程序存於主存的那一空間區域,完全可以由操作系統或者管理程序根據主存的物理地址,將用戶的程序安置於主存的任一部分。而用戶只需要給出形式地址(邏輯地址),就可以進行訪問。

采用專用寄存器作基址寄存器(隱式)

  • 基址寄存器內容由操作系統或管理程序確定
  • 在程序的執行過程中基址寄存器內容不變,形式地址 A 可變

image-20200930112633648

采用通用寄存器作基址寄存器(顯式)

  • 由用戶指定哪個通用寄存器作為基址寄存器
  • 基址寄存器的內容由操作系統確定
  • 在程序的執行過程中 R0 內容不變,形式地址 A 可變

image-20200930112802474

變址尋址

變址尋址需設有變址寄存器,其操作數的有效地址為:形式地址與變址寄存器的地址(基地址)相加。

這與基址尋址極為類似。

基址尋址與變址尋址的區別

  • 基址尋址主要用於為程序和數據分配存儲空間,故基址寄存器的內容通常由操作系統或者管理程序進行確定,在程序執行過程中不可變,而指令字中A可變。
  • 變址尋址主要用於處理數組問題,的變址寄存器的內容由用戶設定,而指令字中的A不可變。在數組處理問題中,可設定A為數組首地址,不斷修改變址寄存器中的地址,很容易形成數組中任意數據的地址,適合編制循環程序。

下面為使用變址寄存器編制循環的例子:其中直接尋址需要N+2條指令,而變址尋址僅僅需要8條。

image-20200930114440326

相對尋址

有效地址為:程序計數器PC的內容與指令字中的形式地址相加結果。

  • 常用於轉移類指令,轉移后的目標地址與當前指令之間存在一段相對距離。
  • A的位數決定的該尋址方式的尋址范圍。
  • 轉移地址不固定,可隨PC值變化而變化,無論程序在主存的那段區域,都可正確運行,對於編寫浮動程序比較有利。

image-20200930114835583

對於編制這類尋址,需要注意:當前指令PC的地址是下一條指令的地址。

參見下面的例子

image-20200930115429771

堆棧尋址

直接將數據壓棧或者出棧。

軟堆棧:使用內存的一部分空間作為堆棧

image-20200930145535248

自增尋址

  • 指令實例:Add R1, (R2)+
  • 含義:
    • Regs[R1]←Regs[R1]+Mem[Regs[R2]]
    • Regs[R2]←Regs[R2]+d

自減尋址

  • 指令實例:Add R1, -(R2)
  • 含義:
    • Regs[R2]←Regs[R2] - d
    • Regs[R1]←Regs[R1] + Mem[Regs[R2]]

縮放尋址

  • 指令實例:Add R1, 100(R2)[R3]
  • 含義: Regs[R1]←Regs[R1]+Mem[ 100+Regs[R2]+Regs[R3]*d ]

指令系統結構的分類

可以從指令系統的具體實現,更為精確的是,CPU中存儲操作數的方式將指令系統結構划分為三類:

  • 堆棧型結構,CPU的存儲單元為堆棧
  • 累加器型結構,CPU的存儲單元為累加器
  • 通用寄存器型結構,CPU的存儲單元為通用寄存器

在通用寄存器型結構中,依據操作數來源的不同,又可以進一步划分為

  • 寄存器-存儲器型結構(RM)。ALU指令的操作數可以來源於存儲器,也可以來源於寄存器。
  • 寄存器-寄存器型結構(RR)。ALU指令的操作數只能來源於寄存器。

此時,仍然可以進行進一步的划分,依據ALU指令的操作數的個數以及ALU指令操作數中可以來源於存儲器的操作數個數可以進行進一步的划分。

image-20201008110054694

這里所指的ALU指令可以認為是一般的計算指令,例如ADD

堆棧型結構,累加器型結構,通用寄存器型結構比較

ALU指令操作數顯隱式分析

  • 堆棧型結構,ALU指令的所有操作數都隱式給出,其操作數一般為棧頂元素和次棧頂元素。
  • 累加器型結構,ALU指令的一個操作數隱式給出,存儲在累加器中,ALU指令的其他操作數顯式給出。
  • 通用寄存器型結構,ALU指令的所有操作數都顯式給出。

image-20201008110436735

完成一個操作的指令條數也是可以評價一個指令體系結構的標准,例如完成ADD操作,堆棧型比累加器型和RM型的指令條數多,在一定程度上反映了其劣處。

但是這也並不絕對,RR型的指令條數雖然多於RM型,但是,其更適合流水,運算速度不一定會慢。

因而,評價一個指令體系需要多方面的考慮。

優劣略覽

堆棧型和累加器型計算機的優勢:

  • 指令字比較短
  • 程序占用的空間都比較小

堆棧型計算機的瓶頸:

  • 不能隨機的訪問堆棧,難以生成有效的代碼
  • 對於棧頂的訪問速度在某種程度上難以進行大幅度提升

累加器型計算機的瓶頸

  • 只有一個中間結果暫存器,需要頻繁的訪問存儲器

通用寄存器型計算機的優勢

  • 寄存器可以存放變量。可以減少存儲器的通信量,加快程序的執行速度。
  • 編譯器根據程序需要,可以更加容易,有效地分配和使用寄存器。例如:在表達式求值方面,(A * B) - (C * D),對於堆棧型和寄存器型計算機,二者在減少訪存的前提下,只能順序計算。

對於RR和RM的各種類型計算機的分析

寄存器-寄存器型(0,3)

  • 指令字長固定,指令結構簡潔,是一種簡單的代 碼生成模型,各種指令的執行時鍾周期數相近。
  • 與指令中含存儲器操作數的指令系統結構相比, 指令條數多,目標代碼不夠緊湊,因而程序占用 的空間比較大。

寄存器-存儲器型(1,2)

  • 可以在ALU指令中直接對存儲器操作數進行引用,而不必先 用load指令進行加載,容易對指令進行編碼,目標代碼比較緊湊。
  • 指令的執行時鍾周期因操作數的來源(寄存器或存儲器)的不同而差別比較大。
  • 在一條指令中同時對寄存器操作數和存儲器操作數進行編碼,有可能限制指令所能夠表示的寄存器個數。
  • 由於有一個操作數的內容將被破壞,所以指令中的兩個操作數不對稱。

存儲器-存儲器型(2,2)或(3,3)

  • 目標代碼最緊湊,不需要設置存儲器來保存變量。
  • 指令字長變換很大,特別是3個操作數指令。
  • 而且每條指令完成的工作也差別很大,所需要的時鍾周期差別也比較大。

對於這一部分,隨着可以直接使用的存儲器操作數目的增加,一方面使得代碼更加緊湊,一方面使得指令字長會受到影響,以及不同指令的執行周期差別較大,難以確定總的執行周期。

指令系統的設計和優化

指令系統的設計可以分成兩個部分:

  • 指令功能的設計
  • 指令格式的設計

指令功能的設計

一般而言,在指令系統的設計過程中,最先完成的設計是指令功能的設計。

概念

指令功能的設計包含以下部分:

  • 考慮所要實現的基本功能
  • 決定這些基本功能中哪些基本功能由硬件實現,那些基本功能由軟件實現。

設計方式

在決定那些基本功能由硬件實現,那些基本功能由軟件實現時,主要的考慮因素有三個:速度,成本,以及靈活性

使用硬件實現的功能速度快、成本高、靈活性差。與之相反,軟件實現的功能速度慢、價格便宜、靈活性好。

其實這一步就是決定軟硬件界面的分界線。一般而言,這里采用“大概率事件優先”原則,使用頻率較高的基本功能以硬件實現,使用頻率較低的功能以軟件實現。

指令系統功能的基本要求

完整性

在一個有限可用的存儲空間內,對於任何 可解的問題,編制計算程序時,指令系統所提供的 指令足夠使用。

要求指令系統功能齊全、使用方便。

規整性

  • 對稱性:所有與指令系統有關的存儲單元的使用、操作碼的設置等都是對稱的。
  • 均勻性:指對於各種不同的操作數類型、字長、操作種類和 數據存儲單元,指令的設置都要同等對待。
  • 一般而言,所實現的有限的規整性。實現完全的規整性太復雜也並不現實。

正交性

在指令中各個不同含義的字段,如操作類型、 數據類型、尋址方式字段等,在編碼時應互不相關、相 互獨立。

高效率

指指令的執行速度快、使用頻度高。

兼容性

主要是要實現向后兼容,指令系統可以增加新 指令,但不能刪除指令或更改指令的功能

控制指令功能的具體實現

控制指令可以分成以下三種

  • 分支指令,有條件的改變控制流
  • 跳轉指令,無條件的改變控制流
  • 過程調用和過程返回指令

Ps:

一般而言,分支指令和跳轉指令都會顯式地給出目標地址,而過程返回指令會由於不知道其返回地址,使用PC相對尋址進行處理。

PC相對尋址,是指:在指令中給出相應的偏移量,以當前PC中值與偏移量之和即為目標地址。

分支條件表示 優 點 缺 點
條件碼(CC):在程序的控制下,由ALU 操作設置特殊的位 可以自由設置分支條件 條件碼是增設的狀態,而且它限制了指令的執行順序,因為必須保證條件碼能順利地傳送給分支指令
條件寄存器:比較指 令把比較結果放入任 何一個寄存器,檢測 時就檢測該寄存器 簡單 占用了一個寄存器
比較分支:比較操作 是分支指令的一部分, 比較受限制 一條指令 完成了兩 條指令的 功能 采用流水方式時,該指令的操作可能太多,在一拍內做不完

指令格式的設計

概念

確定指令字的編碼方式,包括操作碼字段以及地址碼字段的編碼和表示方式。

指令設計的兩種方式

等長擴展碼

其實就是擴展碼技術。

可以根據該指令使用的頻率以及該指令中操作數的地址位數進行操作碼的選取。

image-20201009152725448

定長操作碼

固定長度的操作碼:所有指令的操作碼都是同一的長度。

可以保證操作碼的譯碼速度、減少譯碼的復雜度。

指令系統的發展和改進

一個方向是強化指令功能,實現軟件功能向硬件功能轉移, 基於這種指令集結構而設計實現的計算機系統稱為復雜指令集計算機(CISC, complex instruction set computer)

另一個方向是盡可能地降低指令集結構的復雜性,以達到簡化實現, 提高性能的目的。基於這種指令集結構而設計實現的計算機系統稱為精簡指令集計算機(RISC, reduced instruction set computer)

沿CISC方向發展和改進指令系統

面向目標程序增強指令功能

目的

  • 減少程序的執行時間
  • 減少程序所占的空間

方法

  • 對於使用頻度較高的指令,用硬件加快其執行
  • 對於使用頻度較高的指令串,使用一條的新的指令進行代替

具體例子

  • 增強運算型指令的功能,例如:多項式計算,十進制運算等等
  • 增強數據傳送指令的功能,例如:成組傳送指令
  • 增強程序控制指令的功能,例如:循環指令

面向高級程序語言的優化實現

目的

  • 縮小機器語言與高級語言之間的語義差距,使得編譯器可以對高級語言所編寫的代碼進行較好的優化。

方法

  • 對高級語言中執行頻率高,執行時間長的語句,增強相應的指令功能。
  • 增強指令系統結構的規整性,減少指令系統結構中的各種例外情況。

面向操作系統的優化實現改進指令系統

就是對操作系統更加友好

總的來講,沿CISC方向發展和改進指令系統就是:指令不夠我就加指令,指令不快我就硬件實現指令

CISC結構的問題

  • 在CISC結構的指令系統中,各種指令的使用頻率相差懸殊。據統計,有20%的指令使用頻率最大,占 運行時間的80%。也就是說,有80%的指令在20% 的運行時間內才會用到。
  • CISC結構指令系統的復雜性帶來了控制器硬件的復雜性,控制器硬件大量占用芯片面積,給VLSI(超大規模集成電路)設計造成很大困難。這不僅增加了研制時間和成本,而且還容易造成設計錯誤。
  • CISC結構的指令系統中,許多復雜指令需要很復雜的操作, 導致CPI比較大。
  • 在CISC結構的指令系統中,由於各條指令的功能不復雜,規整性不好, 不利於采用流水技術來提高系統的性能。

沿RISC方向發展和改進指令系統

RISC機器的指令系統設計原則

  • 指令條數少,指令功能簡單。在確定指令系統時,只選取使用頻度很高的指令,在此基礎上補充一些最有用的指令。
  • 采用簡單而又統一的指令格式,減少尋址方式。
  • 指令的執行在單周期內完成(采用流水線技術后)。
  • 只有load和store操作指令才訪問存儲器,其它指令操作均在寄存器之間進行。
  • 大多數指令都采用硬連線邏輯進行實現。
  • 強調優化編譯器的作用,為高級語言程序生成優化的代碼。以簡單有效的方式支持高級語言。

RISC系統效能分析

image-20201010104908910

對於RISC系統而言,IC一般較大,但CPI較低,Tclk也比較低。

下面是MIPS(RISC)與VAX(CISC)的對比

image-20201010105038305

MIPS指令系統結構

下面所介紹的將會是MIPS64的一個子集

MIPS是一個典型的RISC架構的指令系統。

寄存器

  • 32個64位通用寄存器(General-Purpose Registers, GPRs)。即:R0, R1, R2,...., R31。其中R0的內容永遠是0。

  • 32個32位單精度浮點寄存器(Floating-Purpose Registers, FPRs)。即:F0, F1, F2,...., F31。其中可以存儲32個單精度浮點數,也可以存儲16個雙精度浮點數。

  • 一些特殊寄存器。如浮點狀態寄存器,用來保存有關浮點操作結果的信息。

數據類型

  • 整型數據:8位,16位,32位。
  • 浮點數據:32位單精度浮點數,64位雙精度浮點數

尋址方式

  • 立即數尋址eg:ADD R1,R2,#42
  • 寄存器尋址eg:ADD R1,R2,R3
  • 偏移量尋址:變址尋址,基址尋址(相對尋址)。eg:LW R2,40(R3)

拓展來講,偏移量尋址又可以拓展為:寄存器間接尋址以及16位絕對尋址。

  • 當偏移量為0時,寄存器間接尋址
  • 當寄存器位R0時,16位絕對尋址

Ps:在MIPS中,不論是立即數尋址還是偏移量尋址,立即數字段與偏移量字段都是16位。

指令格式

image-20201010100924676

I型指令

指令 效果
Load Regs[rt] << Regs[rs] + immediate
Store Regs[rs] + immediate << Regs[rt]
寄存器-立即數ALU指令 Regs[rt] << Regs[rs] op immediate
分支指令 PC << Regs[rs] + immediate
寄存器跳轉,寄存器跳轉並鏈接(鏈接:設置返回地址) PC << Regs[rs]

R型指令

寄存器-寄存器型ALU指令,專用寄存器讀寫指令,move指令。

指令 效果
寄存器-寄存器型ALU指令 Regs[rd] << Regs[rs] func Regs[rt]

J型指令

跳轉指令,跳轉並鏈接指令,自陷指令,異常返回指令。

指令的低26位為偏移量,與NPC(next PC)相加得到形成跳轉的地址。

操作類型

Ps:符號說明

  • 符號“←”表示數據傳送操作,其后附帶一個下 標n,也即“←n” 表示傳送一個n位數據。
  • 符號“##”用來表示兩個域的串聯操作,它可以出現在數據傳送操作的任何一邊。
  • 域的下標用來表明從該域中選擇某一位。域中位的標記是從最高位開始標記,並且起始標記為0。下標可以是一個單獨的數字,如Regs[R4]0 表示選擇寄存器R4中內容的符號位;下標也可 以是一個范圍,如Regs[R3]24..31表示選擇寄存器 R3中內容的最低一個字節。
  • 上標表示復制一個域,如024可以得到一個24位全為0的一個域。
  • 變量Mem用來表示存儲器中的一個數組,存儲器按照字節尋址,它可以傳送任何數目的字節。
  • image-20201010103035552

load store

image-20201010103144128

ALU指令

image-20201010103125311

控制指令

image-20201010103310344

對於控制指令的細節之處:就是name的取值,不知道為什么上面會那么進行取值,那么范圍不就盲目擴大了嗎?而下面的這個是按照之前的指令格式中相應位數進行取值的。

image-20201010104130217

浮點指令

操作包括加、減、乘、除。且都具有單精度雙精度兩種格式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM