胡老師第十週講義
指令系統
4.1指令系統的發展和效能要求
4.1.1指令系統及其發展
基本上是由簡單到複雜再精簡的過程
arm指令系統使用在手機上面,功效更低,但是能耗更小
x86指令系統使用的pc機上面,功效比較高,但是能耗比較高
mips是瀕臨倒閉的指令系統
4.1.2指令系統性能的要求
完備性:
用指令系統編寫各種程式時,指令系統直接提供的指令足夠使用,而不必用軟體來實現。
有效性:
利用該指令系統所編寫的程式能夠在計算機上高
效率執行,主要表現在程式佔據儲存空間小、執行速度快。
規整性:
規整性包括指令系統的對稱性、勻齊性、指令格式和資料格式的一致性 。
相容性:
系列機各機種之間具有相同的基本結構和共同的基本指令集,低檔機上執行的軟體可以在高檔機上執行,即做到“向下相容” 。
4.2指令格式
4.2.1指令格式
舉一個例子:
使用的操作指令如下所示
所以我們可以得出一個結論:指令是由 操作碼+地址碼 構成的
指令格式指用機器字表示的指令的結構形式,由兩部分
組成,即進行何種操作和從儲存器的那個單元取數;前者稱
為操作碼,後者稱為地址碼。所以指令的一般格式為
4.2.2指令字長度
指令字長度:一個指令字中包含二進位制程式碼的位數
機器字長度:計算機能直接處理二進位制資料的位數,他決定了計算機運算精度
於是衍生出了以下概念
單字長指令:指令字長等於機器字長度的指令。
半字長指令:指令字長等於半個機器字長度的指令。
雙字長指令:指令字長等於兩個機器字長度的指令。
多字長指令:指令字長等於幾個機器字長度的指令。
使用多字長指令,目的在於提供足夠的地址位來解決訪問
記憶體任何單元的定址問題。其主要缺點是必須兩次或多次訪問
記憶體才能取出一整條指令,降低了的運算速度,又佔用了更多
的儲存空間。
4.2.3操作碼
操作碼是而二進位制碼,和指令之間是強制的一一對應關係,是指令的身份證
一般來說n位操作碼就有2n 條指令
操作碼的舉例
按操作碼是否固定:
- 定長操作碼
- 變長操作碼
4.2.4指令助記符
為了便於指令的書寫和閱讀,並且為了便於儲存,所以採用二到三個字母縮寫表示指令,我們稱為指令助記符
4.2.5地址碼
根據一條指令中有幾個運算元地址,可將該指令稱為幾運算元指令或幾地址指令。
4.2.5.1三地址指令
舉一個簡單的例子,一個加法的操作需要三個地址指令,被運算元,運算元,操作結果三個數
這個過程
4.2.5.2二地址指令
指令萊爾位數
地址碼可以是記憶體的地址,也可以是暫存器的地址。
於是通過運算元的物理位置,可以把指令分為三種類型
- SS型別:(儲存器-儲存器型別),運算元都放在記憶體裡。(計算機內不允許)
- RR型別:(暫存器-暫存器型別),運算元都在暫存器裡面,執行效率比較高,
- RS型別:(暫存器-儲存器型別),
4.2.5.3一地址指令
單運算元指令,通常可以使用的有累加操作指令。,指令字的地址碼啊欄位所指明的數為運算元,操作結果又放回累加暫存器中
4.2.5.4零地址指令
停機指令,沒有沒有地址碼。
4.3運算元型別
4.3.1一般的資料型別
以奔騰32位x86架構處理器為例:
4.3.2Pentium資料型別
處理器裡面的資料結構有:
int,double,string,char
4.4指令和資料的定址方式
4.4.1指令定址
順序定址
在記憶體中一條接著一條執行指令
如何讓CPU明白什麼是順序執行:使用程式計數器(指令指標暫存器IP)每執行一條指令其值加1,指向下一條欲執行的指令地址。
跳躍定址
所謂跳躍,是指下條指令的地址不是由程式計
數器PC加1產生,而是將本條指令給出的目標地址裝入PC作為
下條指令的地址。
當程式執行迴圈指令或是轉移指令是,
4.4.2運算元定址
形式地址是指令字中的地址,有效地址是運算元的記憶體地址,定址過程就是通過定址特徵把運算元的形式拆吹吹,變換為有效地址的過程。
立即數定址
直接記憶體定址
在指令格式的形式地址A中直接指出C座數的有效地址EA。由於運算元地址直接給嘔出而不需要變換。
間接記憶體定址
可以擴大定址範圍,但是效率很低,基本上已經被淘汰了。
間接定址的情況下,指令地址欄位的形式地址A不是運算元的有效地址EA, A單元的內容才是運算元的有效地址EA。
按推薦使用的方式:暫存器定址
當運算元不放在記憶體中,而是放在CPU的通用暫存器中時, 可採用暫存器定址的方式,此時指令中給出的運算元地址不是記憶體的地址單元號,而是通用暫存器的編號。
暫存器的間接定址方式
暫存器愛間接定址方式與暫存器定址的方式區別在於:指令中的運算元地址只是處的暫存器中的內容不是運算元,而是運算元的有效地址EA。
以上的四種定址方式是十分基礎的定址方式。所有的指令系統都是支援的。
指令表達
add R0 R3
定址方式 | 定址標記位 | 簡單舉例 |
---|---|---|
立即定址 | # | mov R0 , #10H |
直接記憶體定址 | 無 | mov R0 , 10H |
暫存器定址 | Ri | mov R0 , R1 |
暫存器間接定址 | @ | mov R0 , @R1 |
彙編指令:
mov R0 , #0 0->R0
mov R1, #100 100->R1
next add R0, R1 R0+R1->R0
sub R1, #1 R1 -1
JNZ next 迴圈回去
現在有十個數相加,把他們相加以後的地址放在3000H
可用使用9次加法,但是不夠優雅,更加優雅的做法:
R0 部分累加和, R! : 計數值, R2 :地址值
mov R0 ,#0
mov R1 ,#9
mov R2 #2000H
偏移定址
需要對地址進行運算,把暫存器的地址加上一個偏移量,這個偏移量一般就是指令中的形式地址。
4.4.3基址位定址方式
基質定址的方式可以擴大定址範圍。基址暫存器的暫存器位數可以設定為32位甚至是40位左右。形式地址:16位, 基址暫存器:40位,那麼有效的定址位數是40位。
在程式的執行
過程中BR內容不變,由作業系統指定,形式地址A可變。
4.4.4變址定址器
變址暫存器和基址暫存器的計算有效地址的方法十分相像。
IX:在執行一條指令,IX會自動的加一,所以在處理例如,字串,陣列等連續記憶體塊來儲存資料的資料結構的時候,具有很好的效果。
變址定址器和基址定址器的區別是A和IX, BR是否可以由使用者改變
4.4.5堆疊定址方式
串聯堆疊:
一些計算機的CPU中有一組專門的暫存器,有16個或者更
多,其中每一個暫存器能儲存一個字的資料,由專用的暫存器
組構成堆疊的儲存空間,我們稱為串聯堆疊
儲存器堆疊
sp是一個CPU的一個專用的暫存器,在儲存器空間裡面尋要一個堆疊指示器SP,他是CPU中一個專用的暫存器。堆疊指示器SP 指定的儲存器單元就是堆疊的棧頂。棧底永遠在高地址
堆疊儲存器的特點
-
棧暫存器的操作指令只有兩個,一個是pop,一個是push。
-
堆疊入棧是先入再減那麼出棧就是先加再出,二者是映象對稱的。
-
堆疊是由高地址到底地址延伸的空間,是反向生長段。所以先入的棧底地址,是高地址。
-
堆疊的棧頂一般使用堆疊指標SP表示。入棧和出棧的操作
-
如果指標從高往低移動的時候移到了較低的位置,那麼可能會移到其他資料的資料區域。這就叫做快取溢位。
-
堆疊的長度可以由程式設計師來確定
-
堆疊的數目可以由程式設計師來決定
-
堆疊的主要儲存的是程式碼段的返回地址
-
可以使用儲存定址的任意指令來對堆疊中得到資料進行定址。
一般來說,程式碼段和資料段都是正向生長段,因為程式碼在編譯時候就能過確定大小。但是堆疊段不同,因為對戰的資料程式碼空間大小不確定,只能是先分配一個比較大的地址,然後在往小了分配地址。
變長操作碼的指令
4.4.6指令格式
二地址指令的結構
指令格式的舉例
- 這個指令有多長(單字長還是雙字長)
- 這個指令是幾地址碼
- 這個指令是RR指令還是RS型指令
如何判斷一個指令是否正確
-
先取出來一個指令,
-
翻譯成二進位制
-
根據格式取前若干位,對照操作指令
最後尊稱而錯誤的原因:
4.5典型指令
典型的指令方式
4.5.1複雜指令計算機
經典代表:X86奔騰計算機
複雜指令系統的代表是X86,廣泛的應用於微型
計算機,其特點是效能好,但是能耗和成本高。
例如奔騰機有191條指令,9種定址方式。
但是通過對複雜指令系統計算機(CISC)的測試表
明,最常使用的一些最簡單最基本的指令,只佔指令
總數的20%,並且這些指令在程式中出現的頻率達到
80%以上。
4.5.2經典指令系統
典型代表:ARM手機架構
- 選取使用頻率最高的一些簡單指令,減少指令系統
的指令條數。- 指令長度固定,指令格式種類少,定址方式少。
- 只有取數/存數指令訪問儲存器。其餘的指令的操
作都在暫存器間進行。- CPU內部的通用暫存器個數多。
4.5.3MIPS指令格式
MIPS架構由斯坦福大學開發,是一種有高度擴充套件性的
流水RISC處理器。 2002年,中國科學院計算所開始研發龍
芯處理器,採用MIPS架構
MIPS R4000處理器:指令字長32位,通用暫存器32個
Function的作用:操作碼有些不夠用,OP來確定一大類的指令,Function來確定其他的指令。
MIPS指令舉例
MIPS裡面的偏移定址:LW $s1,100($s2)
-
100加一個括號相當於是在畫面的範圍裡面加了一個偏移量
-
$s1 在RS裡面就是 18