2015-10-05 235 views
0

所以我一直在寫mips程序,它使用循環,分支,然後在計算完成後存儲值。mips存儲指令偏移量和移動指令

我不直接從我的編碼問問題;但是,關於mips編程的一些一般問題,我並沒有經歷過。

問題是可以使用也是寄存器的偏移量將字,字節(sw,sb)存儲到寄存器嗎?

我的意思是,當我使用循環有時我想存儲地址值從0-8(0偏移到第8偏移量)。

在這種情況下,我不能這樣做

sb $t0, 0($a0) 
# assume $t0 is my value, and $a0 is the register that contains the address I want to access to 

,因爲在同一個地址,這將始終儲值不管多少次,我經歷的循環,每一次將覆蓋值。

所以是有可能有這樣的事情

# assume $t0 is my value, $t1 is my offset index, 
# $a0 is the register that contains the address I want to access to 
.... outside the loop .... 
add $t1, $zero, $zero # initialize $t1=0 
.... inside the loop .... 
sb  $t0, $t1($a0)  # store $t0(byte) to 0($a0) 
addi $t1, $t1, 1   # increment the value of $t1 by 1 

在這種情況下,我可以存儲從0($ A0)字節說8($ A0)。

另一個問題是關於使用移動指令。

這些說明是否相互等同?

# assume $t0 is empty register, $s0 is the target 
add $t0, $s0, $zero # $t0 = $s0+0 
move $t0, $s0   # $t0 = $s0 

他們什麼時候可以等價,什麼時候不能?

如果問題很混亂,請事先致謝並對缺少解釋感到抱歉。

p.s.對於第一個問題,sll或srl可能會更好,但如果是的話,你可以舉個例子嗎?

回答

1
  1. 不,你只需要自己添加兩個寄存器。在一個循環中,也許你可以迭代使用指針,而不是索引。
  2. 是的,雖然編譯器可能爲move生成不同的指令,這是一個僞指令。
+0

哇,我完全忘了指針,我怎麼會哈哈。感謝您的回答,我注意到我也可以在數據段中分配'.space',並將其用作我以後的存儲空間。 – dnTosh