計算機組成基礎(3)-- 指令系統層


通過前文《微體系結構層》,我們已經引入了指令系統層的概念,本文是對指令系統層更系統的闡述。並且以ARMv7指令系統層爲例加以闡釋

一、概述

  1. 什麼是指令系統層?
    指令系統是指計算機所能執行的全部指令的集合,指令是一組有意義的二進制代碼。指令的基本格式爲操作碼字段+地址碼字段。

  2. 提出指令系統層概念的好處?
    不同CPU公司生產的計算機硬件不同,實現同一種操作邏輯的硬件實現過程是不同的。指令系統層要將硬件實現過程封裝好,這樣以後,各個計算機公司生產的同一系列的計算機儘管其硬件實現方法可以不同,但指令系統、數據格式、I/O 系統等保持相同,方便用戶使用,也保持系統向上兼容。

  3. 複雜指令系統(CISC)與精簡指令系統的(RISC)的特點
    提出複雜指令系統(CISC)與精簡指令系統的(RISC)的初衷都是要提高計算機系統的計算性能。
    CISC通過縮小高級語言與機器指令之間的語義差距,簡化目標程序,即認爲計算機性能的提高主要依靠增加指令複雜性及其功能來獲取。帶來的代價是實現機器指令的硬件複雜度上升,微指令系統複雜程度上升,單一指令的執行週期加大,從而造成整個程序執行時間增加。
    針對CISC缺陷,提出了RISC思想,強調簡單而統一格式的指令譯碼,採用高效的流水和編譯方法進行流水調度,簡化微指令系統,RISC 的主要問題是編譯後生成的目標代碼較長, 佔用了較多的存儲器空間,另一個潛在缺點是對編譯器要求較高。

  4. 一條指令的完整格式是怎麼樣的?
    一條指令包含下列信息:(1)操作碼,具體說明了操作的性質及功能,每一條指令對應一個操作碼。(2)操作數從那裏來,CPU通過該地址取得所需操作數。(尋址)(3)操作結果的存儲地址,把指令處理的結果保存在該地址中。(4)下一條指令的地址

  5. 指令系統層有哪些指令?
    基本的指令有數據處理指令(包括算術運算、邏輯運算、移位、比較)、數據傳送指令(寄存器之間、寄存器與主存儲器之間)、程序控制指令(條件轉移、無條件轉移指令)、I/O指令(讀寫)、狀態管理指令(存儲保護、中斷處理)。計算機也在根據用戶需求不斷引入新指令,例如爲了防止不同進程同時進入臨界區,出現了信號指令(PV操作)

  6. 執行一條指令的步驟?
    可分爲以下幾個步驟:(1)取指令階段。將一條指令從主存中取出送到指令寄存器中。(2)指令譯碼階段。在組合邏輯控制的計算機和微程序控制的計算機不同(3)指令執行階段(4)訪存取數階段。根據指令需要,有可能訪問主存讀取操作數。(5)結果寫回階段

二、ARMv7指令系統層概述

  1. 我們說ARMv7是32位的,這裏的32位指的是地址總線根數或者數據總線根數概念麼

    1. 由淺到深分析這個問題,首先32位指的是寄存器的位數(即微體系結構層那些寄存器都是32位的)。
    2. 寄存器既可以暫存地址信息又可以暫存數據信息,顯然32這個數字是人們設計出來的,那人們基於什麼目標設計出的這個數字呢?是地址還是數據?
    3. 當然是數據總線,你32位數據總線,ALU一次就能處理32bit的數據,8位數據總線的ALU一次只能處理8bit的數據,在相同頻率的情況下,8位數據總線的ALU就得連續處理4次數據,數據量才能和32位數據總線一次處理的數據量相同,性能差4倍呢。
    4. 但是要注意,定下32這個數字後,地址總線的大小也是32位了,限制了地址空間最大隻能尋址到232(實際中你可能只用了幾塊內存芯片,遠遠沒達到這個地址上限,但32這個數字限制了你最終能把地址擴到多大。)
    5. 所以ARM體系結構中,CPU一次處理一個字,一個字的大小是32位。這個概念不影響字節的概念(字節就是8位),字節的字長是人們基於使用習慣統一成8位的。
    6. 還有一個疑惑要解答:數據總線32位是不是意味着從內存某個地址取出來的數據是32位的呢?不是! 內存存儲數據的基本單位是字節(即內存的物理地址按照字節計算的)。一個內存物理地址只能取一個字節的數據,32位的寄存器要取4個地址的內存數據纔可以形成一個字。
    7. IJVM的MAR是面向字讀取內存的,而內存的物理地址按照字節計算,因此,MAR中的數字傳遞到地址總線上時,需要一層映射(最簡單的映射方法就是左移兩位)
    8. 4字節構成一個字,一個字在內存裏面的存儲方式,有地址對齊式的存儲,也有非對齊式存儲,前者更好(因爲更好讀寫),後者假如某個數據是從地址6開始的,CPU只能先讀地址4-7的數據,再讀8-11的數據,再組合,顯然很麻煩。
    9. 一個字在內存裏的存儲,高位字是存儲在地址低位還是高位?高位字存儲在地址地位(大端存儲)、高位子存儲在地址高位(小端存儲
  2. ARMv7指令系統層的寄存器有哪些

    1. 16個通用寄存器和32個浮點寄存器 在這裏插入圖片描述
  3. ARM體系結構特點

    1. 加載/存儲體系結構。即能直接訪問內存的唯一操作只有加載與存儲。所有ALU操作的操作數只能來自於寄存器(而不是內存),同時執行結果必須保存在寄存器中。(而不是內存)

二、數據類型

指令系統層定義了各種指令,而指令是要對數據進行處理的(對操作數進行計算),因此,我們要了解清楚數據類型的概念。數據可分爲數值型和非數值型。

數值數據類型

  • 最主要的數值數據類型爲整形
    • 典型長度有8、16、32、64位(定義時佔據的內存空間不同)
    • 無符號整數和有符號整數
  • 浮點型數據,許多計算機對整數操作數與浮點型操作數使用了不同的寄存器

非數值數據類型

  • 字符類型。還是要用01編碼代表字符,常用的字符編碼是ASCII(7位)和UNICODE(16位)
  • 字符串。字符串就是連續的字符流,要麼通過特殊的結束符,要麼通過長度域來表示字符串的長度。指令系統層對字符串提供拷貝、查找、編輯以及其他操作。
  • 布爾值。0爲假,1爲真,布爾值還是按照字節存儲(字節有地址便於訪問)
    • 這種方法優點浪費。用布爾值構成一個32位的數組,那麼一個字(4個字節的地址)存儲滿了布爾信息。這種數據結構稱之爲位圖

指針

  • 寄存器存儲的01信息,這個信息代表一個機器地址,稱之爲指針。微體系結構層的SP、PC、LV都是指針。在寄存器間接尋址一章對指針更深入理解。

三、指令格式

指令格式準則

上一節知道了指令操作的對象有哪些類型,這一節講解對這些對象進行操作的格式怎麼定義的。

常見的指令格式如下。
在這裏插入圖片描述

一條指令佔據一個字的大小是合理的,那麼操作碼該佔據多大空間?地址該佔據多大空間呢?

  • 我們思考:指令的長度是由最大指令長度決定的,那麼一條最長指令佔據的總大小=最大操作碼位數+最長的三地址位數總和。 如果按照這樣定義了長度,如果有一條0地址指令,他的操作碼位數很少,而且他還沒有地址,那麼它勢必存在的很大的空間浪費。
  • 那麼,如何保證指令大小統一的前提下,儘量縮短指令長度呢?(擴展操作碼的思想)
  • 具體實現如下:注意,最高4位爲1111時標誌了要開始使用8位來解釋操作碼了。當次高4位爲1110和1111時,開始使用12位解釋操作碼了。當次次高位爲1111時,開始使用16位解釋操作碼了。
    在這裏插入圖片描述

32位ARM指令格式

ARM採用加載/存儲體系結構,所以沒有尋址的概念,操作數的來源要麼是寄存器、要麼是立即數,操作數的去向也是寄存器,指令格式如下:
在這裏插入圖片描述

四、尋址方式

一條指令中,操作數是從那裏來的呢,也就是尋址的概念

立即尋址

定義操作數的最簡單方式是指令直接包括操作數本身,而不是地址。這樣的操作數稱之爲立即數,立即數的缺點是隻有常數纔有這種方式,且立即數的大小受到地址字段的影響。

直接尋址

指定位於內存中的操作數的一種方法是給出它的完整地址,稱之爲直接尋址。使用直接尋址指令訪問的永遠是同一個內存地址。這個地址中的值會變化,但地址永遠不會變化。因此,直接尋址只能用於訪問全局變量。

寄存器尋址

與直接尋址概念類似,只不過定義的是寄存器的地址而不是內存的地址。在ARM這種加載/存儲體系結構中,幾乎都是這種尋址方式。

寄存器間接尋址

這種方式裏,定義的操作數來自內存,但是對應的內存地址不像直接尋址那樣直接寫在指令中,指令給出的是寄存器的地址,這個寄存器存儲了對應的內存地址信息,這個寄存器中存儲的信息稱之爲指針。這樣的好處是不需要在指令中定義完整的內存地址,而且在指令執行的時候,根據寄存器內容的不同,訪問不同的內存字節。

使用寄存器間接尋址,就能很簡單的實現一個數組1024個元素的累加了。
在這裏插入圖片描述

變址尋址

如果能利用一個寄存器和一個已知的偏移量來訪問內存,稱之爲變址尋址。

  • 例如IJVM中局部變量的訪問,是通過寄存器中的內存指針(LV)加上偏移量來進行。
  • 再例如以下功能:兩個有1024個元素的數組,計算是否存在一個非零對。使用了變址尋址(寄存器R2與A地址這一常量相加的結果來用於訪問內存)
    在這裏插入圖片描述

基址變址尋址

用兩個寄存器和一個偏移量(可選)相加的結果來進行尋址。很好理解,一個寄存器存儲的是偏移量,另一個寄存器中的信息是指針

棧尋址

設計人員希望把指令中的地址設計的足夠短,極端情況乾脆沒有地址,那就是進棧/出棧操作。

這一節提到如何將中綴表達式轉換成後綴(逆波蘭)表達式,轉換成後綴(逆波蘭)表達式的優點是很容易把一條複雜數學表達式轉換成代碼實現。

例如計算(8+2 * 5)/(1+3 * 2-4)
在這裏插入圖片描述

轉移指令的尋址方式

前面討論的都是操作數據的指令。對於轉移指令和過程調用指令,無需指出操作數的尋址方式,但是也需要尋址方式來指定目標地址。

前面討論的大多數尋址方式都可以用於轉移指令。例如直接尋址,直接把目標地址放在指令裏面。

寄存器間接尋址允許程序運行時計算目標地址,然後放入寄存器,再跳轉到目標地址處。這種方法足夠靈活,但增大程序出錯的可能性。

變址尋址利用一個寄存器和一個已知的偏移量來計算目標地址

還有一種是程序計數器尋址(就是變址尋址),把指令中帶符號的偏移量加到程序計數器上來得到目標地址

五、指令類型

(1)數據移動指令
數據移動是指,把某個內存地址中的數據內容拷貝到新的內存單元。進行這種行爲有兩個目的:一個基本目的是給變量賦值。另一個重要原因是爲了高效訪問使用數據

每個數據都存在兩個來源(內存或寄存器),同樣存在兩個目的地(內存或寄存器),所以一共有四種不同的拷貝操作。像LOAD指令就是從內存取數到寄存器、STORE指令是從寄存器取數到內存、MOVE指令是把數據從一個寄存器拷貝到另一個寄存器

(2) 雙操作數指令
使用兩個操作數來產生一個結果。例如算術運算指令,執行整數加、減、乘法、除法。再例如邏輯運算指令

(3)單操作數指令
單操作數指令只有一個操作數而且只產生一個結果,例如移位操作。

某些雙操作數指令經常帶一個特定的操作數,因此指令系統層常常提供單操作數指令快速完成它們的操作,例如自加、自減、清零

(4)比較好條件轉移指令
幾乎所有程序都需要這種能力:對數據進行檢查,並根據檢查結果來決定指令的不同執行順序。
(5) 過程調用指令
調用過程時,返回地址必須保存下來,由過程調用指令把返回地址存放到寄存器中,最好的方法是壓入棧。
(6)循環控制指令
(7)輸入/輸出指令
遇忙等待的程序控制I/O,中斷驅動的I/O,DMA的I/O。

六、控制流

控制流是指指令的動態執行序列,也就是指令序列。
(1)順序控制流和轉移
(2)過程
遞歸遞歸,分爲遞進與迴歸,遞進就是前移結構指針爲局部變量保留空間,迴歸就是過程退出之後,棧被依次清空。
(3)協同過程
在這裏插入圖片描述
(4)陷阱
在這裏插入圖片描述
(5)中斷
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章