2014-03-29 112 views
0

我有一個C代碼在我面前,我不得不翻譯成MIPS彙編語言。如何在彙編語言(MIPS)中執行小於或等於?

我不是在尋找一個直接的答案,但我希望有人糾正我對這個問題的思考方式。

在我的前面的C代碼:

x = ((++z)<=y); 

我在考慮到在x,y和z分別存儲在寄存器$ 6,$ 7 $ 8

問題是我不能使用運算符來比較直接小於或等於。我僅限於使用以下比較操作數:bne,beq,ori,slt。

我走近這一問題的方法是這樣:

 addi $8,$8,1  #this will increment z by 1 to have ++z 
     slt $1,$8,$7 #compares ++z to y if ++z is < than y, it will store 1 in $1 
     beq $8,$7,Label #compares if $8 = $7, if so the code jumps to Label 
Label addi $t0,$0,1 #if ++z = y, stores 1 in $t0 
     ori $6,$t0,$1 #Or's the t0 and t1 and accordingly stores 0 or 1 in x 

這是解決這個問題的正確方法?

+1

跳轉到在下一個指令是在幾乎所有情況下毫無意義。 – Michael

+0

你是什麼意思? – Ralph

+0

'beq $ 8,$ 7,Label' /'Label ...' – Michael

回答

0

正如指出的邁克爾,你應該有下面這樣的標籤,一個行:

  addi $8,$8,1 
     slt $1,$8,$7 
     beq $8,$7,Label 
     addi $t0,$0,1 
Label ori $6,$t0,$1 

有趣的是,你使用slt但不seq,爲什麼不呢?你也許可以做到這一點:(假設情況下發生的很多次)

  addi $8,$8,1 
     slt $1,$8,$7 
     seq $t0,$8,$7 
     ori $6,$t0,$1 

並通過避免一個分支,該程序可以稍微快一點現在

,如果我沒有記錯,sltseq將產生要麼是0,要麼是255.如果你正在編寫一個C/C++兼容的語句,那麼你需要改爲0或1。一種方法是ori後添加的轉變,是這樣的:

  srl $6,$6,7 
+0

如果條件爲真,MIPS'SLT'指令將目標寄存器設置爲1,否則將其設置爲零。 MIPS(MIPS32R2)沒有'SEQ'指令。你可能會想到有條件的移動:'MOVZ',但是這在MIPS MARS模擬器中不被支持。 – markgz

+0

我很確定在SGI MIPS處理器上,'slt'指令返回了255的真實值......我在當前的文檔中看到它說1.參考:http://math-atlas.sourceforge.net/devel /assembly/mips-iv.pdf –