以mips获得位置向量

时间:2015-10-25 19:52:58

标签: assembly mips

我在执行必须执行以下任务的代码时遇到困难:

int m = (first + last) / 2
if (value == v[m])
return v[m]

我正在做的是以下内容:

add $ t5, $ t1, $ t2    # m <- first + last
li $ t6, 2              # assist division
div $ t5, $ t6          # m / 2
mflo $ t5               # m = result

lw $ t7, v ($ t5)       # 
beq $ t7, $ t3, return  # value == v[m] return 

我的问题是lw $ t7, v ($ t5)无效。 任何解决方案?!

1 个答案:

答案 0 :(得分:1)

$和寄存器名称之间的空格看起来像是一个错字,但也许你的汇编程序允许这样做。

如果数组中的元素是单词 - 因为它们似乎是,因为您使用的是lw - 那么它们将相隔4个字节。因此,您需要将索引乘以4以获得正确的地址。这可以使用sll指令完成:

sll $t5, $t5, 2   # $t5 <<= 2 == $t5 *= 4

顺便说一句,当您除以2的幂时,不必使用div。您可以使用srl代替(sra,如果您想要签名分区) :

srl $t5, $t5, 1   # $t5 >>= 1 == $t5 / 2

您可以阅读有关bitshift操作的更多信息on Wikipedia