1. 程式人生 > 其它 >胡老師第十週講義

胡老師第十週講義

指令系統

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二地址指令

指令萊爾位數

地址碼可以是記憶體的地址,也可以是暫存器的地址。

於是通過運算元的物理位置,可以把指令分為三種類型
  1. SS型別:(儲存器-儲存器型別),運算元都放在記憶體裡。(計算機內不允許)
  2. RR型別:(暫存器-暫存器型別),運算元都在暫存器裡面,執行效率比較高,
  3. 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 指定的儲存器單元就是堆疊的棧頂。棧底永遠在高地址

堆疊儲存器的特點

  1. 棧暫存器的操作指令只有兩個,一個是pop,一個是push。

  2. 堆疊入棧是先入再減那麼出棧就是先加再出,二者是映象對稱的。

  3. 堆疊是由高地址到底地址延伸的空間,是反向生長段。所以先入的棧底地址,是高地址。

  4. 堆疊的棧頂一般使用堆疊指標SP表示。入棧和出棧的操作

  5. 如果指標從高往低移動的時候移到了較低的位置,那麼可能會移到其他資料的資料區域。這就叫做快取溢位。

  6. 堆疊的長度可以由程式設計師來確定

  7. 堆疊的數目可以由程式設計師來決定

  8. 堆疊的主要儲存的是程式碼段的返回地址

  9. 可以使用儲存定址的任意指令來對堆疊中得到資料進行定址。

    ​ 一般來說,程式碼段和資料段都是正向生長段,因為程式碼在編譯時候就能過確定大小。但是堆疊段不同,因為對戰的資料程式碼空間大小不確定,只能是先分配一個比較大的地址,然後在往小了分配地址。

變長操作碼的指令

4.4.6指令格式

二地址指令的結構
指令格式的舉例
  1. 這個指令有多長(單字長還是雙字長)
  2. 這個指令是幾地址碼
  3. 這個指令是RR指令還是RS型指令
如何判斷一個指令是否正確
  1. 先取出來一個指令,

  2. 翻譯成二進位制

  3. 根據格式取前若干位,對照操作指令

最後尊稱而錯誤的原因:

4.5典型指令

典型的指令方式

4.5.1複雜指令計算機

經典代表:X86奔騰計算機

複雜指令系統的代表是X86,廣泛的應用於微型
計算機,其特點是效能好,但是能耗和成本高。
例如奔騰機有191條指令,9種定址方式。
但是通過對複雜指令系統計算機(CISC)的測試表
明,最常使用的一些最簡單最基本的指令,只佔指令
總數的20%,並且這些指令在程式中出現的頻率達到
80%以上。

4.5.2經典指令系統

典型代表:ARM手機架構

  1. 選取使用頻率最高的一些簡單指令,減少指令系統
    的指令條數。
  2. 指令長度固定,指令格式種類少,定址方式少。
  3. 只有取數/存數指令訪問儲存器。其餘的指令的操
    作都在暫存器間進行。
  4. 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