跳轉到內容

MIPS 彙編/指令格式

來自 Wikibooks,開放的書,開放的世界

本頁介紹了 MIPS 指令格式的實現細節。

R 指令用於當指令使用的資料值全部位於暫存器中時。

所有 R 類指令都有以下格式

OP rd, rs, rt

其中 "OP" 是特定指令的助記符。所有 R 指令都使用操作碼 0,函式位於 funct 欄位。rsrt 是源暫存器,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

但是,swlw 指令以以下方式呼叫

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 指令

[編輯 | 編輯原始碼]

FR 指令類似於上面描述的 R 指令,只是它們專用於浮點數。

操作碼 fmt ft fs fd funct

FI 指令

[編輯 | 編輯原始碼]

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
  1. Lin, Charles (2003-03-27). "指令格式". 存檔於 原文 於 2018-01-01. 檢索於 2019-11-12.
華夏公益教科書