2017-01-17 44 views
0

我的最終目標是編寫MIPS代碼以這種方式僞MIPS轉移和鏈接命令

temp = 0; 
if (x == y) 
    temp = 1 
...rest of the program... 

我應該寫吧==,!=,< =,> =,<,>

我想過這樣的事情:

li $t1 0 
beq $r1 $r2 Temp1 
/**rest of the program...**/ 

Temp1: 
li $t1 1 
(1) /** how do I return to rest of the program? **/ 

我在MIPS BGEZAL指令(BEQ的insetad)看到了,讓我把在(1)線

jr $ra 

,但我還沒有找到appropiate命令適用於所有情況:BGE,BNE,NEQ等

我的問題:

有什麼簡單的方法適用於所有情況,使這個分支的聯繫呢?

我的意思是,分支標籤,如果有一些情況發生,並存儲在$ ra的pc + 4的地址,所以我可以返回我的代碼?

此外,我不能創造另一個標籤來代表程序的其餘部分(和跳吧),我必須在$ RA莫名其妙地返回,因爲它是基於Java的代碼翻譯MIPS

謝謝。

+0

所以你只需要將'temp'設置爲0/1,你不需要分支,對吧? – Ped7g

+0

是的。分支只是使用bge,beq,bne(等..)命令的結果 – Matan

+0

我不明白基於Java的翻譯如何阻止您爲其餘代碼創建另一個標籤,如果您可以爲「temp1」創建標籤「代碼? – Ped7g

回答

4

在這個例子中

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將在子程序內一起。這至少可以維持一點,上面的例子非常糟糕。

但「條件設置」解決方案當然優於任何分支。

+0

非常感謝。我認爲對我來說最好的解決方案是使用seq,sge,sgt,slt,sle,sne。我在 – Matan

+0

@Matan oh ..之前並不知道這些說明,所以有sle/seq/...僞指令。我只打開了HW參考卡,並沒有弄清楚如何簡單地完成sle/seq。現在我很好奇,這些是如何完成的......(但我沒有MIPS彙編+反彙編)。無論如何,我很高興它幫助你。 :) – Ped7g

+0

@Matan的結果是我有一些微弱的時刻..'sle r,x,y'其實很簡單:'r =!(y Ped7g