在這個例子中
temp = 0;
if (x == y)
temp = 1
...rest of the program...
它更容易使用,相反的分支:
li $t1, 0
bne $r1, $r2, RestOfProgram ; temp already is 0, so only continue
; here you want temp=1, because x==y, so just set it, and continue
li $t1, 1
RestOfProgram:
...rest of the program...
所以,你這樣做是:
temp = 0;
if (x != y) goto rest_of_program
temp = 1
rest_of_program:
...rest of the program...
(這是醜陋的僞C,但在ASM中,這是更優雅和更乾淨的方式,因爲「goto」是ASM的工作方式,而僅有條件地執行一些指令反對ASM性質的「這裏我有pc
集,所以我會執行它」)。
但你並不需要在所有分支(如果你的目標是在條件設置一些寄存器爲0或1),例如:
temp = (x < y);
slt $t1, $r1, $r2 ; or "sltu" for unsigned values
temp = (x > y)
slt $t1, $r2, $r1 ; or "sltu" for unsigned values
EDIT2(我做了小姐存在< =,> =,...通過僞插入,並且沒有產生很好的答案,編輯它現在更準確和完整):
也有僞指令sle/sge/seq /對於< =,> =,==,!=。
至於我自己的好奇心,我不得不來看看它們是如何實現的,基本上是:
sgt: temp = (y < x) (slt with swapped arguments)
sle: temp = !(y < x) (slt, xori)
sge: temp = !(x < y) ("sle" with swapped arguments)
seq: temp = |x - y| < 1 (subu, $at=1, sltu)
sne: temp = 0 < |x - y| (subu, sltu $zero)
EDIT1:如果你堅持要慢$嶺子例程,然後將整個測試到Temp1:
li $t1, 0
jal Temp1_when_equal
... rest of code ...
Temp1_when_equal: ; will set $t1 to 1 when $r1 == $r2
bne $r1, $r2, Temp1_keep_0
li $t1, 1
Temp1_keep_0:
jr $ra
但它不是我清楚你爲什麼能做到這,並能不做T他適當的東西,似乎很奇怪,你可能有一些非常奇怪的情況(基本上我不相信你,你可能錯過了如何在沒有標籤的注入代碼中分支,所以你認爲這是不可能的,但它是,只要你可以注入類似於你的問題的代碼,你也可以在注入短代碼的範圍內注入帶有「剩餘代碼」目標的分支)。
如果你真的必須這樣做,那麼考慮將它全部移到子程序,所以主代碼將只有和li
將在子程序內一起。這至少可以維持一點,上面的例子非常糟糕。
但「條件設置」解決方案當然優於任何分支。
所以你只需要將'temp'設置爲0/1,你不需要分支,對吧? – Ped7g
是的。分支只是使用bge,beq,bne(等..)命令的結果 – Matan
我不明白基於Java的翻譯如何阻止您爲其餘代碼創建另一個標籤,如果您可以爲「temp1」創建標籤「代碼? – Ped7g