我在执行必须执行以下任务的代码时遇到困难:
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)
无效。
任何解决方案?!
答案 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。