針對MIPS指令集本身的講解,主要是它上層的彙編表示和下層的機器表示,以及它的訪存方式、操作數等等。同時也對MIPS指令集日落西山表示感慨。 ...
上一篇電腦系統5-> 計組與體繫結構2 | MIPS指令集(上)| 指令系統從頂層講解了一個指令集 / 指令系統應當具備哪些特征和工作原理。這一篇就聚焦MIPS指令集(MIPS32),看看其彙編語句和機器語言是什麼樣子的。
參考資料:
- Computer Organization and Design the 5th Edition,即電腦組成與設計硬體軟體介面第五版
- 龍芯杯MIPS指令系統規範手冊
- 課件,由於是英文且只是老師的思路,所以是輔助參考
- 《電腦組成原理》譚志虎,HUST(此書強推)
- 《電腦組成原理》MOOC HUST
00 數據格式
本文約定MIPS32的數據格式定義如下:
- 比特(bit, b)
- 位元組(Byte, 8bits, B)
- 半字(Halfword, 16bits, H)
- 字(Word, 32bits, W)
這個不搞搞清楚,後續還會麻煩,不如放在最前面。
01 操作數
自上一篇對於指令系統的整體介紹可以知道,指令集的操作數是指令的操作對象,它有三個來源:立即數、寄存器和存儲器。這裡來看一下MIPS32指令系統支持的操作數空間。
01-1 立即數操作數
在上一篇的介紹中,立即數是由地址碼表示的,所以MIPS的立即數的長度由指令格式決定,再具體一點是指令格式中的地址碼長度決定。
01-2 寄存器操作數
2022-04-16 整理此文期間,老師發了一個講解寄存器的鏈接
打開之後,我覺得講得還不錯,對於各個寄存器的功能都有說明,就是排版不太好。
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只採用了其中的五種,即:(也簡單回憶一下)
-
立即數定址
imm欄位 / D欄位就是立即數本身。
-
寄存器定址
操作數放在某個寄存器中,形式地址D欄位 / imm欄位給出寄存器的編號,有的指令可能會使用多個寄存器,也就會用到多段寄存器編碼段。
-
基址定址
寄存器存放基地址,形式地址D欄位存放變化量。
-
相對定址
EA = PC + 4 + D。
-
偽直接定址
這種比較新,實際操作是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型;具體格式如下:
下麵是對上圖各個部分的一個解釋:
- 圖中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型指令就是立即數型指令,至多可以使用兩個寄存器,按照執行的功能有以下情況:
- 如果是雙目運算,則將寄存器rs和立即數imm分別作為源操作數,將結果送入rt寄存器中;
- 如果是Load / Store指令,則將寄存器rs和立即數imm值相加得到有效地址EA,將EA送入rt寄存器中;
- 如果是條件分支指令,則對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 算術運算指令
一共十四條,包括加、減、乘、除、置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)。
-
操作定義:
-
例 外:
- 如果有溢出,則觸發整型溢出例外。
-
-
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)。
-
操作定義:
-
例外:
- 如果有溢出,則觸發整型溢出例外。
-
-
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]
-
例 外:
- 無
-
-
ADDIU
-
機器格式:
-
彙編格式:
ADDIU rt, rs, imm
-
功能描述:
- 將寄存器 rs 的值與有符號數至 32 位的立即數 imm 相加,結果寫入 rt 寄存器中。(沒寫錯1!)
-
操作定義:
GPR[rt] ← GPR[rs] + sign_extend(imm)
-
例 外:
- 無
-
-
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)。
-
操作定義:
-
例外:
- 無
-
-
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]
-
例 外:
- 無
-
-
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
-
例 外:
- 無
-
-
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
-
例 外:
- 無
-
-
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
-
例 外:
- 無
-
-
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
-
例 外:
- 無
-
-
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 寄存器中。
-
操作定義:
-
例 外:
- 無
-
-
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 寄存器中。
-
操作定義:
-
例 外:
- 無
-
-
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
-
例 外:
- 無
-
-
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 邏輯運算指令
-
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]
-
例 外:
- 無
-
-
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)
-
例 外:
- 無
-
-
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)
-
例 外:
- 無
-
-
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]
-
例 外:
- 無
-
-
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]
-
例 外:
- 無
-
-
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)
-
例 外:
- 無
-
-
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]
-
例 外:
- 無
-
-
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 移位指令
-
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
-
例 外:
- 無
-
-
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
-
例 外:
- 無
-
-
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
-
例 外:
- 無
-
-
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
-
例 外:
- 無
-
-
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
-
例 外:
- 無
-
-
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 分支跳轉指令
-
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 計算得到。
-
操作定義:
-
例 外:
- 無
-
-
BNE
-
彙編格式:
BNE rs, offset
-
功能描述:
- 如果寄存器 rs 的值不等於寄存器 rt 的值則轉移,否則順序執行。轉移目標由立即數 offset 左移 2位併進行有符號擴展的值加上該分支指令對應的延遲槽指令的 PC 計算得到。
-
操作定義:
-
例 外:
- 無
-
-
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 計算得到。
-
操作定義:
-
例 外:
- 無
-
-
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 計算得到。
-
操作定義:
-
例 外:
- 無
-
-
BLEZ
-
機器格式:
-