MIPS 彙編/指令格式
外觀
本頁介紹了 MIPS 指令格式的實現細節。
R 指令用於當指令使用的資料值全部位於暫存器中時。
所有 R 類指令都有以下格式
OP rd, rs, rt
其中 "OP" 是特定指令的助記符。所有 R 指令都使用操作碼 0,函式位於 funct 欄位。rs 和 rt 是源暫存器,rd 是目標暫存器。例如,add 助記符可以用於
add $s1, $s2, $s3
其中,$s2 和 $s3 中的值相加,結果儲存在 $s1 中。在本指南的主要部分中,運算元將用這些名稱表示。
將 R 助記符轉換為等效的二進位制機器碼,可以使用以下方法執行
| 操作碼 | rs | rt | rd | 移位 (shamt) | funct |
| 6 位 | 5 位 | 5 位 | 5 位 | 5 位 | 6 位 |
- 操作碼
- 操作碼是指令助記符的機器碼錶示。操作碼欄位長 6 位(第 26 位到第 31 位),但在 R 格式中始終設定為 0。要執行的實際指令位於 funct 欄位中。
- rs, rt, rd
- 源暫存器和目標暫存器的數字表示。這些數字對應於暫存器的 $X 表示,例如 $0 或 $31。每個欄位長 5 位。(分別為 25 到 21、20 到 16 和 15 到 11)。有趣的是,rs 和 rt 並沒有被命名為 r1 和 r2(表示源暫存器 1 和 2),而是分別被命名為 "rs" 和 "rt",代表暫存器源、暫存器目標和暫存器目標。
- 移位 (shamt)
- 與移位和旋轉指令一起使用,這是源運算元 rs 旋轉/移位的量。此欄位長 5 位(6 到 10)。
- Funct
- 在 R 格式指令中,操作碼始終為零,funct 引數包含不同指令的程式碼。長 6 位(0 到 5)。例如,要將兩個暫存器中的數字相加並將結果放入第三個暫存器中,操作碼將設定為零,函式將設定為 0x20。
I 指令用於當指令必須對立即值和暫存器值進行操作時。立即值最多可以長 16 位。立即指令無法操作更大的數字。
I 指令以以下方式呼叫
OP rt, rs, IMM
但是,sw 和 lw 指令以以下方式呼叫
OP rt, IMM(rs)
其中,rt 是目標暫存器,rs 是源暫存器,IMM 是立即值。立即值最多可以長 16 位。例如,addi 指令可以呼叫為
addi $s1, $s2, 100
其中,$s2 的值加上 100 儲存在 $s1 中。
I 指令以以下格式轉換為機器碼字
| 操作碼 | rs | rt | IMM |
| 6 位 | 5 位 | 5 位 | 16 位 |
- 操作碼
- 指令的 6 位操作碼。在 I 指令中,所有助記符都與底層操作碼有一對一對應關係。這是因為沒有funct 引數來區分具有相同操作碼的指令。6 位(26 到 31)
- rs, rt
- 分別為源暫存器和目標暫存器運算元。每個運算元 5 位(分別為 21 到 25 和 16 到 20)。[1]
- IMM
- 16 位立即值。16 位(0 到 15)。該值通常用作各種指令中的偏移值,並且根據指令,可能以二進位制補碼錶示。
J 指令用於執行跳轉時。J 指令對立即值有最多的空間,因為地址是較大的數字。
J 指令以以下方式呼叫
OP LABEL
其中,OP 是特定跳轉指令的助記符,LABEL 是要跳轉到的目標地址。
J 指令具有以下機器碼格式
| 操作碼 | 偽地址 |
| 6 位 | 26 位 |
- 操作碼
- 對應於特定跳轉命令的 6 位操作碼。(26 到 31)。
- 地址
- 目標地址的 26 位縮短地址。(0 到 25)。完整的 32 位目標地址是透過連線 PC 的最高 4 位(緊隨跳轉指令後的指令地址)、26 位偽地址和 2 個零位(因為指令始終與 32 位字對齊)形成的。
FR 指令類似於上面描述的 R 指令,只是它們專用於浮點數。
| 操作碼 | fmt | ft | fs | fd | funct |
FI 指令類似於上面描述的 I 指令,只是它們專用於浮點數。
| 操作碼 | fmt | ft | Imm |
下表列出了 MIPS 指令和相應的操作碼。操作碼和函式編號均以十六進位制表示。
| 助記符 | 含義 | 型別 | 操作碼 | Funct |
|---|---|---|---|---|
add |
加法 | R | 0x00 | 0x20 |
addi |
加法立即數 | I | 0x08 | NA |
addiu |
無符號加法立即數 | I | 0x09 | NA |
addu |
無符號加法 | R | 0x00 | 0x21 |
and |
按位與 | R | 0x00 | 0x24 |
andi |
按位與立即數 | I | 0x0C | NA |
beq |
如果相等則跳轉 | I | 0x04 | NA |
blez |
如果小於或等於零則跳轉 | I | 0x06 | NA |
bne |
如果不相等則跳轉 | I | 0x05 | NA |
bgtz |
如果大於零則跳轉 | I | 0x07 | NA |
div |
除法 | R | 0x00 | 0x1A |
divu |
無符號除法 | R | 0x00 | 0x1B |
j |
跳轉到地址 | J | 0x02 | NA |
jal |
跳轉並連結 | J | 0x03 | NA |
jalr |
跳轉並連結暫存器 | R | 0x00 | 0x09 |
jr |
跳轉到暫存器中的地址 | R | 0x00 | 0x08 |
lb |
載入位元組 | I | 0x20 | NA |
lbu |
載入無符號位元組 | I | 0x24 | NA |
lhu |
載入無符號半字 | I | 0x25 | NA |
lui |
載入高位立即數 | I | 0x0F | NA |
lw |
載入字 | I | 0x23 | NA |
mfhi |
從 HI 暫存器中移動 | R | 0x00 | 0x10 |
mthi |
移動到 HI 暫存器 | R | 0x00 | 0x11 |
mflo |
從 LO 暫存器中移動 | R | 0x00 | 0x12 |
mtlo |
移動到 LO 暫存器 | R | 0x00 | 0x13 |
mfc0 |
從協處理器 0 移動 | R | 0x10 | NA |
mult |
乘法 | R | 0x00 | 0x18 |
multu |
無符號乘法 | R | 0x00 | 0x19 |
nor |
按位非或 (NOT-OR) | R | 0x00 | 0x27 |
xor |
按位異或 (Exclusive-OR) | R | 0x00 | 0x26 |
or |
按位或 | R | 0x00 | 0x25 |
ori |
按位或立即數 | I | 0x0D | NA |
sb |
儲存位元組 | I | 0x28 | NA |
sh |
儲存半字 | I | 0x29 | NA |
slt |
如果小於則設定為 1 | R | 0x00 | 0x2A |
slti |
如果小於立即數則設定為 1 | I | 0x0A | NA |
sltiu |
如果小於無符號立即數則設定為 1 | I | 0x0B | NA |
sltu |
如果小於無符號數則設定為 1 | R | 0x00 | 0x2B |
sll |
邏輯左移 | R | 0x00 | 0x00 |
srl |
邏輯右移(0 擴充套件) | R | 0x00 | 0x02 |
sra |
算術右移(符號擴充套件) | R | 0x00 | 0x03 |
sub |
減法 | R | 0x00 | 0x22 |
subu |
無符號減法 | R | 0x00 | 0x23 |
sw |
儲存字 | I | 0x2B | NA |