跳轉到內容

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。它們可以與 beqbne 以及 $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 和擴充套件的立即值都被視為無符號整數。符號擴充套件允許立即值表示非常大和非常小的無符號整數。

華夏公益教科書