mips存储指令偏移量,并移动指令

时间:2015-10-05 20:17:49

标签: assembly mips

所以我一直在编写使用循环,分支的mips程序,然后在计算完成后存储值。

我不是直接从我的编码问问题;但是,而是关于mips编程的一些一般性问题,因为我不熟悉它。

问题是,是否可以使用也是寄存器的偏移量将字,字节(sw,sb)存储到寄存器中?

我的意思是,当我使用循环时,有时我想将值存储在地址中,例如0-8(0offset到第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 个答案:

答案 0 :(得分:1)

  1. 不,你只需要自己添加两个寄存器。在循环中,也许你也可以使用指针迭代,而不是索引。
  2. 是的,虽然编译器可能会为move生成不同的指令,这是伪指令。