計算機系統6-> 計組與體系結構3 | MIPS指令集(中)| MIPS彙編指令與機器表示

climerecho發表於2022-04-18

上一篇計算機系統5-> 計組與體系結構2 | MIPS指令集(上)| 指令系統從頂層講解了一個指令集 / 指令系統應當具備哪些特徵和工作原理。這一篇就聚焦MIPS指令集(MIPS32),看看其彙編語句和機器語言是什麼樣子的。

參考資料:

  1. Computer Organization and Design the 5th Edition,即計算機組成與設計硬體軟體介面第五版
  2. 龍芯杯MIPS指令系統規範手冊
  3. 課件,由於是英文且只是老師的思路,所以是輔助參考
  4. 《計算機組成原理》譚志虎,HUST(此書強推)
  5. 《計算機組成原理》MOOC HUST

00 資料格式

本文約定MIPS32的資料格式定義如下:

  1. 位元(bit, b)
  2. 位元組(Byte, 8bits, B)
  3. 半字(Halfword, 16bits, H)
  4. 字(Word, 32bits, W)

這個不搞搞清楚,後續還會麻煩,不如放在最前面。

01 運算元

自上一篇對於指令系統的整體介紹可以知道,指令集的運算元是指令的操作物件,它有三個來源:立即數、暫存器和儲存器。這裡來看一下MIPS32指令系統支援的運算元空間。

01-1 立即數運算元

在上一篇的介紹中,立即數是由地址碼錶示的,所以MIPS的立即數的長度由指令格式決定,再具體一點是指令格式中的地址碼長度決定。

01-2 暫存器運算元

2022-04-16 整理此文期間,老師發了一個講解暫存器的連結

開啟之後,我覺得講得還不錯,對於各個暫存器的功能都有說明,就是排版不太好。

此文第32問之後,講解了為什麼是32個通用暫存器

MIPS-32指令集共有32個32位通用暫存器,按照編碼原理,機器指令中可以用5個bit來編碼32個暫存器;在彙編中可以用暫存器編號0~31表示,但更推薦用它們的名字( $ +兩個字元),因為不同的暫存器的預設工作不同,如果有名稱來進行區分,對於彙編層次的程式設計者更友好一些。具體表示如:$sp , $t0等等。

為什麼會給暫存器取名,從下面這個表格就可見一斑。後續下一篇介紹高階語言程式段的彙編翻譯的時候,還會具體說明這些暫存器的功能分類。

為什麼使用32個通用暫存器?

答:

使用64個或更多暫存器不但需要更大的指令空間來對暫存器編碼,還會增加上下文切換的負擔。除了那些很大不能感非常複雜的函式,32個暫存器就已足夠儲存經常使用的資料。使用更多的暫存器並不必要,同時計算機設計有個原則叫“越小越快”,但是也不是說使用31個暫存器會比32個效能更好,32個通用暫存器是流行的做法。

編號 助記符 英文全稱 功能簡述
$0 $zero zero 恆零值,0號暫存器參與加法運算可實現MOV功能
$1 $at Assemble Temp 彙編器保留暫存器,可用於偽指令的中間變數
$2 ~ 3 $v0 ~ v1 value 儲存子程式的非浮點返回值
$4 ~ 7 $a0 ~ a3 Argument 用於儲存子程式呼叫前的4個非浮點引數
$8 ~ 15 $t0 ~ t8 Temporaries 臨時變數,呼叫者儲存暫存器,可在子程式中直接呼叫
$16 ~ 23 $s0 ~ s7 Saved Registers 通用暫存器,被呼叫者儲存暫存器,在子程式中使用時必須先壓棧儲存原值,使用後應出棧恢復原值
$24 ~ 25 $t8 ~ t9 Temporaries 臨時變數,同$8 ~ 15。
$26 ~ 27 $k0 ~ k1 Kernel Reserved 作業系統核心保留暫存器,用於中斷處理
$28 $gp Global Pointer 全域性指標
$29 $sp Stack Pointer 棧指標,指向棧頂
$30 $fp / $s8 Frame Pointer 幀指標,用於過程呼叫;也是$s8,可用作Saved Register
$31 $ra Return Address 儲存子程式返回地址

我們通常意義上說的32個暫存器,就是上述32個通用暫存器。事實上,MIPS還提供了32個32位的單精度浮點暫存器,用$f0 ~ f31表示,兩兩拼合還可以形成16個64位的雙精度暫存器。此外,MIPS還有其他特殊暫存器:

  • 整數乘除暫存器\(hi,\)lo

    • hi 暫存器存放乘法指令結果的高半部分或是除法指令結果的餘數。
    • 用指令mfhi("move from hi")來訪問hi。
    • lo 暫存器存放乘法指令結果的低半部分或是除法指令結果的商。
    • 用指令mflo("move from lo")訪問lo。
  • 程式控制器PC

    • 無法直接訪問。
  • ⭐協處理器CP0的暫存器

    • CP0是協處理器((Co-Processor)之一其中有一組暫存器,一共32個;
    • CP0 必須實現,起到控制CPU的作用,主要用於中斷、例外控制。MMU、異常處理、乘除法等功能,都依賴於協處理器CP0來實現。它是MIPS的精髓之一,也是開啟MIPS特權級模式的大門。
    • 後續的特權指令中會有很多使用CP0暫存器的地方。
    • 協處理器的32個暫存器介紹
    • 協處理器如何控制CPU
    • 這裡提一個暫存器,EPC,這個暫存器存放異常發生時,系統正在執行的指令的地址。後面特權指令ERET會用到。

01-3 儲存器運算元

有230個儲存器字,根據00部分的資料格式,這裡一個儲存器字也就是32位bit,即4個byte,所以換算成我們更常見的形式有:

232bytes = 222KB = 212MB=4GB,可見MIPS32的記憶體是4GB。

02 定址方式

上一篇中我們介紹了指令系統的11 種訪存方式,MIPS只採用了其中的五種,即:(也簡單回憶一下)

  1. 立即數定址

    imm欄位 / D欄位就是立即數本身。

  2. 暫存器定址

    運算元放在某個暫存器中,形式地址D欄位 / imm欄位給出暫存器的編號,有的指令可能會使用多個暫存器,也就會用到多段暫存器編碼段。

  3. 基址定址

    暫存器存放基地址,形式地址D欄位存放變化量。

  4. 相對定址

    EA = PC + 4 + D。

  5. 偽直接定址

    這種比較新,實際操作是EA = { PC+4的高四位(31到28),imm(D欄位),00 }

    可見此處的EA達到了32位bit,也即30位儲存字。

對於具體的指令格式,R型指令的定址方式只有暫存器定址;I型指令的定址方式有暫存器定址、立即數定址、基址定址、相對定址;J型指令的只有偽直接定址。

03 指令格式

03-1 統一介紹

瞭解一個指令集最重要的是指令格式,指令格式統帥了所有其他的方面。MIPS32種所有的指令都是32位定長指令,格式很規整(很漂亮);對於實在難以用統一格式表述的指令,MIPS採取了折中的辦法,即讓指令的一部分看上去是一樣的,其他的部分進行一些微調。

MIPS指令格式有三種:I型、R型、J型;具體格式如下:

213

下面是對上圖各個部分的一個解釋:

  • 圖中opcode欄位就是操作碼,一般簡稱為OP,不過R型指令有一點與眾不同,R型指令的OP段全為0),具體的指令功能由低6位function(funct) 欄位決定,這裡的funct欄位就是擴充套件操作碼
  • 至於定址方式,MIPS的定址方式是沒有單獨的欄位的,而是放在操作碼欄位裡。
  • 上面看到的rs、rt、rd就是暫存器運算元欄位,各用五位表示(32個通用暫存器正好編碼5個二進位制位);R型指令可以有三個暫存器運算元,而I型指令最多兩個暫存器運算元,而J型不需要暫存器運算元。
  • 上圖其他元素還有shamt欄位(五位的sa),用於移位指令,其他指令這一段為0;以及I型指令的imm欄位,可以表示16位的有符號立即數,立即數範圍為 [-32768, 32767]。J型指令的instr_index(Address欄位)有26位。

03-2 R型 / 暫存器型

R型指令的運算元只能來自暫存器,運算結果也只能來自暫存器,屬於上一篇中所提到RR型指令。下面先來說說MIPS的R型指令的機器語言格式:

因為具體指令打算放到指令功能裡再整理,這裡舉一個典例,MIPS的加法在彙編中表示為:

add $s1,$t0,$s4
# 當然也可寫成
add $17,$8,$20

意思是 把 t0(8號)和s4(20號) 暫存器的內容相加,把結果放到s1(17號)暫存器,機器格式為:

位數 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 06 05 ~ 00
格式 op rs rt rd shamt funct
舉例 000000 8 20 17 0 32

03-3 I型 / 立即數型

I型指令就是立即數型指令,至多可以使用兩個暫存器,按照執行的功能有以下情況:

  1. 如果是雙目運算,則將暫存器rs和立即數imm分別作為源運算元,將結果送入rt暫存器中;
  2. 如果是Load / Store指令,則將暫存器rs和立即數imm值相加得到有效地址EA,將EA送入rt暫存器中;
  3. 如果是條件分支指令,則對rs和rt暫存器中的資料進行規定的判別運算,並根據結果決定是否進行跳轉,如果發生跳轉,那麼跳轉後的地址EA由相對定址方式獲得(PC+4與立即數imm相加得到)

舉一個典例,MIPS中的beq指令,指令作用是相等則跳轉:

beq $s1,$s2,25

意為判斷\(s1和\)s2中運算元是否相等,如果相等去地址為PC+4+imm的地方繼續執行。

位數 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
格式 op rs rt imm
舉例 000100 17 18 25

注意這裡的意義是:

if($s1 == $32) go to
PC+4+100 #即 imm<<2

為什麼是100不是25呢?

答:如果發生轉移,要將imm左移2位,並符號擴充套件至32位,然後與PC+4相加,加法的結果就是轉移目的地址,從該地址取指令。

03-4 J型 / 跳轉型

J型指令主要是無條件轉移指令,其特點是僅有操作碼和地址碼兩個欄位,採用偽直接定址,有效地址EA 用PC+4的高4位26位的imm經左移2位後拼接得到:

J型指令常用的有兩個:j 和 jal

注意:jr和jalr雖然也實現無條件跳轉,但不是J型。

指令名 OP IMM 實現描述 備註
j 000010 26位 PC <- {PC+431:28,imm,00} 無條件分支
jal 000011 26位 R[31] <- PC+8(如無延遲槽為PC+4);PC <- {PC+431:28,imm,00} 子程式呼叫指令

04 指令功能

本部分參考:龍芯杯MIPS指令系統規範手冊,開源,上傳至部落格檔案。

04-1 算術運算指令

234

一共十四條,包括加、減、乘、除、置1五個小類。

  1. ADD

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 100000
      位數 6 5 5 5 5 6
    • 彙編格式:

      • ADD rd, rs, rt
        
    • 功能描述:

      • 將暫存器 rs 的值與暫存器 rt 的值相加,結果寫入暫存器 rd 中。如果產生溢位,則觸發整型溢位例外(IntegerOverflow)。
    • 操作定義:

      sd

    • 外:

      • 如果有溢位,則觸發整型溢位例外。
  2. ADDI

    • 機器格式:

      地址 31 ~ 26 26~21 20 ~ 16 15 ~ 0
      格式 001000 rs rt imm
      位數 6 5 5 16
    • 彙編格式:

      • ADDI rt, rs, imm
        
    • 功能描述:

      • 將暫存器 rs 的值與有符號擴充套件至 32 位的立即數 imm 相加,結果寫入 rt 暫存器中。如果產生溢位,則觸發整型溢位例外(IntegerOverflow)。
    • 操作定義:

      sd

    • 例外:

      • 如果有溢位,則觸發整型溢位例外。
  3. ADDU

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 100001
      位數 6 5 5 5 5 6
    • 彙編格式:

      ADDU rd, rs, rt
      
    • 功能描述:

      • 將暫存器 rs 的值與暫存器 rt 的值相加,結果寫入 rd 暫存器中。
    • 操作定義:

      GPR[rd] ← GPR[rs] + GPR[rt]
      
    • 外:

  4. ADDIU

    • 機器格式:

    • 彙編格式:

      ADDIU rt, rs, imm 
      
    • 功能描述:

      • 將暫存器 rs 的值與有符號數至 32 位的立即數 imm 相加,結果寫入 rt 暫存器中。(沒寫錯1!)
    • 操作定義:

      GPR[rt] ← GPR[rs] + sign_extend(imm)
      
    • 外:

    • ADDI,ADDIU,ADD,ADDU的區別、有符號無符號的謬誤

  5. SUB

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 100010
      位數 6 5 5 5 5 6
    • 彙編格式:

      SUB rd, rs, rt
      
    • 功能描述:

      • 將暫存器 rs 的值與暫存器 rt 的值相減,結果寫入 rd 暫存器中。如果產生溢位,則觸發整型溢位例外(IntegerOverflow)。
    • 操作定義:

      23

    • 例外:

  6. SUBU

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 100011
      位數 6 5 5 5 5 6
    • 彙編格式:

      SUBU rd, rs, rt
      
    • 功能描述:

      • 將暫存器 rs 的值與暫存器 rt 的值相減,結果寫入 rd 暫存器中。
    • 操作定義:

      GPR[rd] ← GPR[rs] – GPR[rt]
      
    • 外:

  7. SLT

    • 機器格式

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 101010
      位數 6 5 5 5 5 6
    • 彙編格式:

      SLT rd, rt, rs
      
    • 功能描述:

      • 將暫存器 rs 的值與暫存器 rt 中的值進行有符號數比較,如果暫存器 rs 中的值小,則暫存器 rd 置 1;否則暫存器 rd 置 0
    • 操作定義:

      if GPR[rs] < GPR[rt] then
      	GPR[rd] ← 1
      else
      	GPR[rd] ← 0
      endif
      
    • 外:

  8. SLTI

    • 機器格式:

      地址 31 ~ 26 26~21 20 ~ 16 15 ~ 0
      格式 001010 rs rt imm
      位數 6 5 5 16
    • 彙編格式:

      SLTI rt, rs, imm
      
    • 功能描述:

      • 將暫存器 rs 的值與有符號擴充套件至 32 位的立即數 imm 進行有符號數比較,如果暫存器 rs 中的值小,則暫存器 rt 置 1;否則暫存器 rt 置 0。
    • 操作定義:

      if GPR[rs] < Sign_extend(imm) then
      	GPR[rt] ← 1
      else
      	GPR[rt] ← 0
      endif
      
    • 外:

  9. SLTU

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 101011
      位數 6 5 5 5 5 6
    • 彙編格式:

      SLTU rd, rs, rt
      
    • 功能描述:

      • 將暫存器 rs 的值與暫存器 rt 中的值進行無符號數比較,如果暫存器 rs 中的值小,則暫存器 rd 置 1;否則暫存器 rd 置 0。
    • 操作定義:

      if (0||GPR[rs]31..0) < (0||GPR[rt]31..0) then
      	GPR[rd] ← 1
      else
      	GPR[rd] ← 0
      endif
      
    • 外:

  10. SLTIU

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 001011 rs rt imm
      位數 6 5 5 16
    • 彙編格式:

      SLTIU rt, rs, imm
      
    • 功能描述:

      • 將暫存器 rs 的值與有符號擴充套件 至 32 位的立即數 imm 進行無符號數比較,如果暫存器 rs 中的值,則暫存器 rt 置 1;否則暫存器 rt 置 0。
    • 操作定義:

      if (0||GPR[rs]31..0) < Sign_extend(imm) then
      	GPR[rt] ← 1
      else
      	GPR[rt] ← 0
      endif
      
    • 外:

  11. DIV

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 6 5 ~ 0
      格式 000000 rs rt 00 0000 0000 011010
      位數 6 5 5 10 6
    • 彙編格式:

      DIV rs, rt
      
    • 功能描述:

      • 有符號除法,暫存器 rs 的值除以暫存器 rt 的值,商寫入 LO 暫存器中,餘數寫入 HI 暫存器中。
    • 操作定義:

      234

    • 外:

  12. DIVU

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 6 5 ~ 0
      格式 000000 rs rt 00 0000 0000 011011
      位數 6 5 5 10 6
    • 彙編格式:

      DIVU rs, rt
      
    • 功能描述:

      • 無符號除法,暫存器 rs 的值除以暫存器 rt 的值,商寫入 LO 暫存器中,餘數寫入 HI 暫存器中。
    • 操作定義:

      ewr

    • 外:

  13. MULT

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 6 5 ~ 0
      格式 000000 rs rt 00 0000 0000 011000
      位數 6 5 5 10 6
    • 彙編格式:

      MULT rs, rt
      
    • 功能描述:

      • 有符號乘法,暫存器 rs 的值乘以暫存器 rt 的值,乘積的低半部分和高半部分分別寫入 LO 暫存器和 HI 暫存器。
    • 操作定義:

      • prod ← GPR[rs]31..0 ×GPR[rt]31..0
      • LO ← prod31..0
      • HI ← prod63..32
    • 外:

  14. MULTU

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 6 5 ~ 0
      格式 000000 rs rt 00 0000 0000 011001
      位數 6 5 5 10 6
    • 彙編格式:

      MULTU rs, rt
      
    • 功能描述:

      • 無符號乘法,暫存器 rs 的值乘以暫存器 rt 的值,乘積的低半部分和高半部分分別寫入 LO 暫存器和 HI 暫存器。
    • 操作定義:

      • prod ← (0 || GPR[rs]31..0) ×(0 || GPR[rt]31..0)
      • LO ← prod31..0
      • HI ← prod63..32
    • 外:

04-2 邏輯運算指令

123

123

  1. AND

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 100100
      位數 6 5 5 5 5 6
    • 彙編格式:

      AND rd, rs, rt
      
    • 功能描述:

    • 暫存器 rs 中的值與暫存器 rt 中的值按位邏輯與,結果寫入暫存器 rd 中。

    • 操作定義:

      GPR[rd] ← GPR[rs] & GPR[rt] 
      
    • 外:

  2. ANDI

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 001100 rs rt imm
      位數 6 5 5 16
    • 彙編格式:

      ANDI rt, rs, imm 
      
    • 功能描述:

      • 暫存器 rs 中的值與 0 擴充套件至 32 位的立即數 imm 按位邏輯與,結果寫入暫存器 rt 中。
    • 操作定義:

      GPR[rt] ← GPR[rs] and Zero_extend(imm)
      
    • 外:

  3. LUI

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 001111 00000 rt imm
      位數 6 5 5 16
    • 彙編格式:

      LUI rt, imm
      
    • 功能描述:

      • 將 16 位立即數 imm 寫入暫存器 rt 的高 16 位,暫存器 rt 的低 16 位置 0。
    • 操作定義:

      GPR[rt] ← (imm || 0000 0000 0000 0000)  
      
    • 外:

  4. NOR

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 100111
      位數 6 5 5 5 5 6
    • 彙編格式:

      NOR rd, rs, rt
      
    • 功能描述:

      • 暫存器 rs 中的值與暫存器 rt 中的值按位邏輯或非,結果寫入暫存器 rd 中。
    • 操作定義:

      GPR[rd] ← GPR[rs] nor GPR[rt] 
      
    • 外:

  5. OR

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 100101
      位數 6 5 5 5 5 6
    • 彙編格式:

      OR rd, rs, rt
      
    • 功能描述:

      • 暫存器 rs 中的值與暫存器 rt 中的值按位邏輯或,結果寫入暫存器 rd 中。
    • 操作定義:

      GPR[rd] ← GPR[rs] or GPR[rt] 
      
    • 外:

  6. ORI

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 001101 rs rt imm
      位數 6 5 5 16
    • 彙編格式:

      ORI rt, rs, imm
      
    • 功能描述:

      • 暫存器 rs 中的值與 0 擴充套件至 32 位的立即數 imm 按位邏輯或,結果寫入暫存器 rt 中。
    • 操作定義:

      GPR[rt] ← GPR[rs] or Zero_extend(imm)
      
    • 外:

  7. XOR

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 100110
      位數 6 5 5 5 5 6
    • 彙編格式:

      XOR rd, rs, rt
      
    • 功能描述:

      • 暫存器 rs 中的值與暫存器 rt 中的值按位邏輯異或,結果寫入暫存器 rd 中。
    • 操作定義:

      GPR[rd] ← GPR[rs] xor GPR[rt]
      
    • 外:

  8. XORI

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 001110 rs rt imm
      位數 6 5 5 16
    • 彙編格式:XORI rt, rs, imm

    • 功能描述:暫存器 rs 中的值與 0 擴充套件至 32 位的立即數 imm 按位邏輯異或,結果寫入暫存器 rt 中。

    • 操作定義:GPR[rt] ← GPR[rs] xor Zero_extend(imm)

    • 外:

04-3 移位指令

wer

  1. SLLV

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 000100
      位數 6 5 5 5 5 6
    • 彙編格式:

      SLLV rd, rt, sa
      
    • 功能描述:

      • 由暫存器 rs 中的值指定移位量,對暫存器 rt 的值進行邏輯左移,結果寫入暫存器 rd 中。
    • 操作定義:

      • s ← GPR[rs]4..0
      • GPR[rd] ← GPR[rt](31-s)..0 || 0s
    • 外:

  2. SLL

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 000000
      位數 6 5 5 5 5 6
    • 彙編格式:

      SLL rd, rt, sa
      
    • 功能描述:

      • 由立即數 sa 指定移位量,對暫存器 rt 的值進行邏輯左移,結果寫入暫存器 rd 中。
    • 操作定義:

      • s ← sa
      • GPR[rd] ← GPR[rt](31-s)..0 || 0s
    • 外:

  3. SRAV

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 000111
      位數 6 5 5 5 5 6
    • 彙編格式:

      SRAV rd, rt, rs
      
    • 功能描述:

      • 暫存器 rs 中的值指定移位量,對暫存器 rt 的值進行算術右移,結果寫入暫存器 rd 中。
    • 操作定義:

      • s ← GPR[rs]4..0
      • GPR[rd] ← (GPR[rt]31) s || GPR[rt]31..s
    • 外:

  4. SRA

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 000011
      位數 6 5 5 5 5 6
    • 彙編格式:

      SRA rd, rt, sa
      
    • 功能描述:

      • 立即數 sa 指定移位量,對暫存器 rt 的值進行算術右移,結果寫入暫存器 rd 中。
    • 操作定義:

      • s ← sa
      • GPR[rd] ← (GPR[rt]31) s || GPR[rt]31..s
    • 外:

  5. SRLV

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 000110
      位數 6 5 5 5 5 6
    • 彙編格式:

      SRLV rd, rt, rs
      
    • 功能描述:

      • 暫存器 rs 中的值指定移位量,對暫存器 rt 的值進行邏輯右移,結果寫入暫存器 rd 中。
    • 操作定義:

      • s ←GPR[rs]4..0
      • GPR[rd] ← 0s || GPR[rt]31..s
    • 外:

  6. SRL

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs rt rd 00000 000010
      位數 6 5 5 5 5 6
    • 彙編格式:

      SRL rd, rt, sa
      
    • 功能描述:

      • 立即數 sa 指定移位量,對暫存器 rt 的值進行邏輯右移,結果寫入暫存器 rd 中。
    • 操作定義:

      • s ← sa
      • GPR[rd] ← 0s || GPR[rt]31..s
    • 外:

04-4 分支跳轉指令

rty

  1. BEQ

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 000100 rs rt offset
      位數 6 5 5 16
    • 彙編格式:

      BEQ rs, rt, offset
      
    • 功能描述:

      • 如果暫存器 rs 的值等於暫存器 rt 的值則轉移,否則順序執行。轉移的目標地址由立即數 offset 左移 2 位並進行有符號擴充套件的值加上該分支指令對應的延遲槽指令的 PC 計算得到。
    • 操作定義:

      ert

    • 外:

  2. BNE

    • 彙編格式:

      BNE rs, offset
      
    • 功能描述:

      • 如果暫存器 rs 的值不等於暫存器 rt 的值則轉移,否則順序執行。轉移目標由立即數 offset 左移 2位並進行有符號擴充套件的值加上該分支指令對應的延遲槽指令的 PC 計算得到。
    • 操作定義:

      234

    • 外:

  3. BGEZ

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 000001 rs 000001 offset
      位數 6 5 5 16
    • 彙編格式:

      BGEZ rs, offset
      
    • 功能描述:

      • 如果暫存器 rs 的值大於等於 0 則轉移,否則順序執行。轉移目標由立即數 offset 左移 2 位並進行有符號擴充套件的值加上該分支指令對應的延遲槽指令的 PC 計算得到。
    • 操作定義:

      234

    • 外:

  4. BGTZ

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 000111 rs 000000 offset
      位數 6 5 5 16
    • 彙編格式:

      BGTZ rs, offset
      
    • 功能描述:

      • 如果暫存器 rs 的值大於 0 則轉移,否則順序執行。轉移目標由立即數 offset 左移 2 位並進行有符號擴充套件的值加上該分支指令對應的延遲槽指令的 PC 計算得到。
    • 操作定義:

      xcv

    • 外:

  5. BLEZ

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 000110 rs 000000 offset
      位數 6 5 5 16
    • 彙編格式:

      BLEZ rs, offset
      
    • 功能描述:

      • 如果暫存器 rs 的值小於等於 0 則轉移,否則順序執行。轉移目標由立即數 offset 左移 2 位並進行有符號擴充套件的值加上該分支指令對應的延遲槽指令的 PC 計算得到。
    • 操作定義:

    • 外:

  6. BLTZ

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 000001 rs 000000 offset
      位數 6 5 5 16
    • 彙編格式:

      BLTZ rs, offset
      
    • 功能描述:

      • 如果暫存器 rs 的值小於 0 則轉移,否則順序執行。轉移目標由立即數 offset 左移 2 位並進行有符號擴充套件的值加上該分支指令對應的延遲槽指令的 PC 計算得到。
    • 操作定義:

      sdf

    • 外:

  7. BGEZAL

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 000001 rs 100001 offset
      位數 6 5 5 16
    • 彙編格式:

      BGEZAL rs, offset
      
    • 功能描述:

      • 如果暫存器 rs 的值大於等於 0 則轉移,否則順序執行。轉移目標由立即數 offset 左移 2 位並進行有符號擴充套件的值加上該分支指令對應的延遲槽指令的 PC 計算得到。無論轉移與否,將該分支對應延遲槽指令之後的指令的 PC 值儲存至第 31 號通用暫存器中。
    • 操作定義:

      hjk

    • 外:

  8. BLTZAL

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 000001 rs 100000 offset
      位數 6 5 5 16
    • 彙編格式:

      BLTZAL rs, offset
      
    • 功能描述:

      • 如果暫存器 rs 的值小於 0 則轉移,否則順序執行。轉移目標由立即數 offset 左移 2 位並進行有符號擴充套件的值加上該分支指令對應的延遲槽指令的 PC 計算得到。無論轉移與否,將該分支對應延遲槽指令之後的指令的 PC 值儲存至第 31 號通用暫存器中。
    • 操作定義:

      xcv

    • 外:

  9. J

    • 機器格式:

      地址 31 ~ 26 25 ~ 0
      格式 000010 offset
      位數 6 16
    • 彙編格式:

      J target
      
    • 功能描述:

      • 無條件跳轉。跳轉目標由該分支指令對應的延遲槽指令的 PC 的最高 4 位與立即數 instr_index 左移2 位後的值拼接得到。
    • 操作定義:

      • I:
      • I+1: PC ← PC31..28 || instr_index || 02
    • 外:

  10. JAL

    • 機器格式:

      地址 31 ~ 26 25 ~ 0
      格式 000011 offset
      位數 6 16
    • 彙編格式:JAL target18

    • 功能描述:無條件跳轉。跳轉目標由該分支指令對應的延遲槽指令的 PC 的最高 4 位與立即數 instr_index 左移2 位後的值拼接得到。同時將該分支對應延遲槽指令之後的指令的 PC 值儲存至第 31 號通用暫存器中。

    • 操作定義:

      • I: GPR[31] ← PC + 8
      • I+1: PC ← PC31..28 || instr_index || 02
    • 外:

  11. JR

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 rs 00 0000 0000 00000 001000
      位數 6 5 10 5 6
    • 彙編格式:

      JR rs
      
    • 功能描述:

      • 無條件跳轉。跳轉目標為暫存器 rs 中的值。
    • 操作定義:

      • I: temp ← GPR[rs]
      • I+1: PC ← temp
    • 外:

  12. JALR

    • 彙編格式:

      • JALR rd, rsJALR rs (rd=31 implied)
    • 功能描述:

      • 無條件跳轉。跳轉目標為暫存器 rs 中的值。同時將該分支對應延遲槽指令之後的指令的 PC 值儲存至暫存器 rd 中。
    • 操作定義:

      • I: temp← GPR[rs]

        ​ GPR[rd] ← PC + 8

      • I+1: PC ← temp

    • 外:

04-5 資料移動指令

  1. MFHI

    • 指令格式:

      地址 31 ~ 26 25 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 00 0000 0000 rd 00000 01 0000
      位數 6 10 5 5 6
    • 彙編格式:

      • MFHI rd
        
    • 功能描述:

      • 將 HI 暫存器的值寫入到暫存器 rd 中
    • 操作定義:

      GPR[rd] ← HI
      
    • 例外:

  2. MFLO

    • 機器格式:

      地址 31 ~ 26 25 ~ 16 15 ~ 11 10 ~ 6 5 ~ 0
      格式 000000 00 0000 0000 rd 00000 01 0010
      位數 6 10 5 5 6
    • 彙編格式:

      MFLO rd
      
    • 功能描述:

      • 將 LO 暫存器的值寫入到暫存器 rd 中。
    • 操作定義:

      GPR[rd] ← LO
      
    • 外:

  3. MTHI

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 6 5 ~ 0
      格式 000000 rs 000 0000 0000 0000 01 0001
      位數 6 5 15 6
    • 彙編格式:

      MTHI rs
      
    • 功能描述:

      • 將暫存器 rs 的值寫入到 HI 暫存器中。
    • 操作定義:

      HI ← GPR[rs]
      
    • 外:

  4. MTLO

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 6 5 ~ 0
      格式 000000 rs 000 0000 0000 0000 01 0011
      位數 6 5 15 6
    • 彙編格式:

      MTLO rs
      
    • 功能描述:

      • 將暫存器 rs 的值寫入到 LO 暫存器中。
    • 操作定義:

      LO ← GPR[rs]
      
    • 外:

04-6 自陷指令

hjk

  1. BREAK

    • 機器格式:

      地址 31 ~ 26 25 ~ 6 5 ~ 0
      格式 000000 code 001101
      位數 6 20 6
    • 彙編格式:

      BREAK
      
    • 功能描述:

      • 觸發斷點例外。
    • 操作定義:

      SignalException(Breakpoint)
      
    • 例外:

      • 斷點例外
  2. SYSCALL

    • 機器格式:

      地址 31 ~ 26 25 ~ 6 5 ~ 0
      格式 000000 code 001100
      位數 6 20 6
    • 彙編格式:

      SYSCALL
      
    • 功能描述:

      • 觸發系統呼叫例外。
    • 操作定義:

      SignalException(SystemCall)
      
    • 例外:

      • 系統呼叫例外。

04-7 訪存指令

  1. LB

    • 機器指令:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 100000 base rt offset
      位數 6 5 5 16
    • 彙編格式:

      LB rt, offset(base)
      
    • 功能描述:

      • 取一個有符號byte
      • 將 base 暫存器的值加上符號擴充套件後的立即數 offset 得到訪存的虛地址,據此虛地址從儲存器中讀取 1 個位元組的值並進行符號擴充套件,寫入到 rt 暫存器中。
    • 操作定義:

      sdfs

    • 例外:

  2. LBU

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 100100 base rt offset
      位數 6 5 5 16
    • 彙編格式:

      LBU rt, offset(base)
      
    • 功能描述:

      • 取一個無符號byte
      • 將 base 暫存器的值加上符號擴充套件後的立即數 offset 得到訪存的虛地址,據此虛地址從儲存器中讀取 1 個位元組的值並進行 0 擴充套件,寫入到 rt 暫存器中。
    • 操作定義:

      ghjhgj

    • 例外:

  3. LH

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 100001 base rt offset
      位數 6 5 5 16
    • 彙編格式:

      LH rt, offset(base)
      
    • 功能描述:

      • 取半個有符號字( half word);
      • 將 base 暫存器的值加上符號擴充套件後的立即數 offset 得到訪存的虛地址,如果地址不是 2 的整數倍則觸發地址錯例外,否則據此虛地址從儲存器中讀取連續 2 個位元組的值並進行符號擴充套件,寫入到rt 暫存器中。
    • 操作定義:

fdg

  • 例外:

    • 地址最低 1 位如果不為 0,觸發地址錯誤例外
  1. LHU

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 100001 base rt offset
      位數 6 5 5 16
    • 彙編格式:

      LHU rt, offset(base)
      
    • 功能描述:

      • 取半個無符號字;
      • 將 base 暫存器的值加上符號擴充套件後的立即數 offset 得到訪存的虛地址,如果地址不是 2 的整數倍則觸發地址錯例外,否則據此虛地址從儲存器中讀取連續 2 個位元組的值並進行 0 擴充套件,寫入到 rt暫存器中。
    • 操作定義:

      dsfsdf

    • 例外:

      • 地址最低 1 位不為 0,觸發地址錯例外
  2. LW

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 100011 base rt offset
      位數 6 5 5 16
    • 彙編格式:

      LW rt, offset(base)
      
    • 功能描述:

      • 取一個字;
      • 將 base 暫存器的值加上符號擴充套件後的立即數 offset 得到訪存的虛地址,如果地址不是 4 的整數倍則觸發地址錯例外,否則據此虛地址從儲存器中讀取連續 4 個位元組的值,寫入到 rt 暫存器中。
    • 操作定義:

      sadad

    • 例外:

      • 地址最低 2 位不為 0,觸發地址錯例外
  3. SB

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 101000 base rt offset
      位數 6 5 5 16
    • 彙編格式:

      SB rt, offset(base)
      
    • 功能描述:

      • 寫入一個byte。
      • 將 base 暫存器的值加上符號擴充套件後的立即數 offset 得到訪存的虛地址,如果地址不是 4 的整數倍則觸發地址錯例外,否則據此虛地址從儲存器中讀取連續 4 個位元組的值,寫入到 rt 暫存器中。
    • 操作定義:

    dxcvc

    • 例外:

  4. SH

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 101011 base rt offset
      位數 6 5 5 16
    • 彙編格式:

      SH rt, offset(base)
      
    • 功能描述:

      • 寫入半個字
      • 將 base 暫存器的值加上符號擴充套件後的立即數 offset 得到訪存的虛地址,如果地址不是 2 的整數倍則觸發地址錯例外,否則據此虛地址將 rt 暫存器的低半字存入儲存器中。
    • 操作定義:

      sdfdf

    • 例外:

      • 地址最低 1 位不為 0,觸發地址錯誤例外
  5. SW

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 0
      格式 101011 base rt offset
      位數 6 5 5 16
    • 彙編格式:

      SW rt, offset(base)
      
    • 功能描述:

      • 將 base 暫存器的值加上符號擴充套件後的立即數 offset 得到訪存的虛地址,如果地址不是 4 的整數倍則觸發地址錯例外,否則據此虛地址將 rt 暫存器存入儲存器中。
    • 操作定義:

      cvbv

    • 例外:

      • 地址最低 2 位不為 0,觸發地址錯誤例外

04-8 特權指令

特權指令在上一篇中僅簡單提到了一次。特權指令指具有特殊許可權的指令。 這類指令只用於作業系統或其他系統軟體,一般不直接提供給使用者使用。 在多使用者、多工的計算機系統中特權指令必不可少。

  1. ERET

    • 機器格式:

      地址 31 ~ 26 25 25 ~ 6 5 ~ 0
      格式 010000 1 000 0000 0000 0000 0000 011000
      位數 6 1 19 6
    • 彙編格式:

      eret
      
    • 功能描述:從 中斷、例外 處返回。

    • 操作定義:PC ← EPC,Status.EXL ← 0,重新整理流水線。

    • 例外:

  2. MFC0

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 3 2 ~ 0
      格式 010000 00000 rt rd 0000_0000 sel
      位數 6 5 5 5 8 3
    • 彙編格式:

      MFC0 rt,rd,sel24
      
    • 功能描述:

      • 從協處理器 0 的暫存器(由rd和sel組合指定)取值到通用暫存器rt中(用GPR表示),當然,有一些CP0暫存器不支援sel,這時sel=0
    • 操作定義:

      • GPR[rt] ← CP0[rd, sel]
    • 例外:

  3. MTC0

    • 機器格式:

      地址 31 ~ 26 25 ~ 21 20 ~ 16 15 ~ 11 10 ~ 3 2 ~ 0
      格式 010000 00100 rt rd 00000000 sel
      位數 6 5 5 5 8 3
    • 彙編格式:

      MTC0 rt, rd, sel
      
    • 功能描述:

      • 向協處理器 0 的暫存器存值
    • 操作定義:

      • CP0[rd, sel] ← GPR[rt]
    • 例外:

05 其他指令集簡介

指令集其實太多了,比如2020年就又出了Loongarch指令集,要每種都在一篇文中講完太過分了。其實我最想說的是×86和RISC-V指令集。後續我還打算繼續瞭解這兩方面的內容(一個經典且廣泛應用,另一個新興且優美),csapp也是×86指令集。

0417看到一個新聞,說是wave computing(MIPS的ip擁有者)轉向了RISC-V。網上感慨的人還很多。

05-1 ×86

×86由16位的8088 / 8086指令系統發展而來,是32位的CISC系統。

  1. 暫存器

    共有8個通用暫存器和8個其他暫存器:

    通用暫存器有:

    暫存器編號 000 001 010 011 100 101 110 111
    暫存器名字 EAX ECX EDX EBX ESI EDI ESP EBP

    其他有:狀態暫存器EEFLAGS、程式暫存器EIP、還有六個段暫存器CS、SS、DS、ES、FS、GS。

  2. 指令格式

    ×86需要向前相容16位系統甚至再之前的8位系統,所以現在的×86極其複雜,硬體實現也很困難。從上一篇文也可以知道它是變長編碼,通過類似於資料結構哈夫曼樹的形式進行編碼,實現字首碼不衝突。

  3. 定址方式

    支援8種定址方式:

    序號 定址方式 EA / 運算元S 指令示例
    1 立即數定址 S = Disp MOV EAX,1000
    2 直接定址 EA = Disp MOV EAX,[1080H]
    3 暫存器定址 S = R[R / M] MOV EAX,ECX
    4 暫存器間接定址 EA = R[R / M] MOV EAX,[EBX]
    5 暫存器相對定址 / 基址定址 EA = R[R / M] + Disp MOV EAX,[ESI+100H]
    6 基址 + 比例變址定址 EA = S * index + Base MOV
    7 基址 + 比例定址 + 偏移量定址 EA = S * index + Base + Disp MOV EAX,[EBX+EDI*4+66]
    8 相對定址 EA = PC + Disp JMP 1000H

05-2 RISC - V

清華計組RISC-V

  1. 暫存器

    RISC-V的暫存器和MIPS大同小異,各種用途的暫存器各有所增減。

  2. 指令格式

    首先遵循RISC的一些要求,同時可以擴充套件為變長。RISC-V的特色是指令硬體實現容易,最大的特色是指令字中的各欄位位置固定(這一點MIPS都沒有做到,可以說更整齊了)。

    較於MIPS多了好幾種格式。

    xcvxcb

  3. 定址方式

    # 定址方式 有效地址EA / S 指令示例
    1 立即數定址 S = imm addi = rd,rs1,imm
    2 暫存器定址 S = R[rs1] add rd,rs1,rs2
    3 暫存器相對定址 / 基址定址 EA = R[rs1] + imm lw rd,imm(rs1)
    4 相對定址 EA = PC+imm<<1 beq rs1,rs2,imm

    加粗是與地址直接相關的部分。

06 簡單回顧 | Review

這部分主要針對MIPS指令集本身進行了學習,主要是它上層的彙編表示和下層的機器表示,以及它的訪存方式、運算元等等。

  1. 可以用的運算元;
  2. 定址方式各種;
  3. 以指令功能分類的各種指令,方便查閱;
  4. 簡單提了提其他指令集

相關文章