MIPS 彙編/控制流指令
跳轉指令將一個新值載入到 PC 暫存器中,該暫存器儲存正在執行的指令的值。這會導致從記憶體中讀取的下一條指令從一個新位置檢索。
指令
|
j | 型別
|
J 型別 |
j 指令將一個立即值載入到 PC 暫存器中。這個立即值要麼是一個數字偏移量,要麼是一個標籤(彙編器會將標籤轉換為偏移量)。
指令
|
jr | 型別
|
R 型別 |
jr 指令將 PC 暫存器載入一個儲存在暫存器中的值。因此,jr 指令可以像這樣呼叫
jr $t0
假設目標跳轉位置位於 $t0 中。
跳轉和連結指令類似於跳轉指令,只是它們將下一條指令的地址(跳轉後立即執行的指令)儲存在返回地址 ($ra; $31) 暫存器中。這允許子程式在完成後返回到主程式主體。
指令
|
jal | 型別
|
J 型別 |
與 j 指令類似,只是返回地址載入到 $ra 暫存器中。
指令
|
jalr | 型別
|
R 型別 |
與 jr 指令相同,只是返回地址載入到指定的暫存器中(如果沒有指定則載入到 $ra 中)
假設我們有一個子程式,它以標籤 MySub 開始。我們可以使用以下程式碼行呼叫子程式
jal MySub ...
我們可以如下定義 MySub 以返回到父程式主體的程式主體
jr $ra
與將 rt 用作目標運算元不同,rs 和 rt 都用作源運算元,並且立即值被符號擴充套件並新增到 PC 中,以計算跳轉到指令的地址(如果分支被執行)。
指令
|
beq | 型別
|
I 型別 |
如果 rs 和 rt 相等,則分支。如果 rs = rt,則 PC ← PC + 4 + imm。
指令
|
bne | 型別
|
I 型別 |
如果 rs 和 rt 不相等,則分支。如果 rs ≠ rt,則 PC ← PC + 4 + imm。
指令
|
bgez | 型別
|
I 型別 |
如果 rs 大於或等於零,則分支。如果 rs ≥ 0,則 PC ← PC + 4 + imm。
指令
|
blez | 型別
|
I 型別 |
如果 rs 小於或等於零,則分支。如果 rs ≤ 0,則 PC ← PC + 4 + imm。
指令
|
bgtz | 型別
|
I 型別 |
如果 rs 大於零,則分支。如果 rs > 0,則 PC ← PC + 4 + imm。
指令
|
bltz | 型別
|
I 型別 |
如果 rs 小於零,則分支。如果 rs < 0,則 PC ← PC + 4 + imm。
如果這些指令的條件為真,則將 rd 設定為 1。它們可以與 beq 和 bne 以及 $zero 結合使用,根據兩個暫存器的比較結果進行分支。
指令
|
slt | 型別
|
R 型別 |
如果 rs < rt,則 rd ← 1,否則為 0。
指令
|
slti | 型別
|
I 型別 |
如果 rs < imm,則 rd ← 1,否則為 0。立即值被符號擴充套件。
指令
|
sltu | 型別
|
R 型別 |
如果 rs < rt,則 rd ← 1,否則為 0。將 rs 和 rt 視為無符號整數。
指令
|
sltiu | 型別
|
I 型別 |
如果 rs < imm,則 rd ← 1,否則為 0。立即值被符號擴充套件,但 rs 和擴充套件的立即值都被視為無符號整數。符號擴充套件允許立即值表示非常大和非常小的無符號整數。