2015-10-25 2 views
0

Я с трудом выполняет код, который необходимо выполнить следующую задачу:получить вектор позиции в трудоемкости

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

_ «не работает» _ является плохим описанием проблемы. Вы должны четко разъяснить, что вы подразумеваете под этим. – Michael

ответ

1

Имея пробелы между $, и имя регистра выглядит как опечатка, но, возможно, ваш ассемблер позволяет это.

Если элементы в вашем массиве являются словами - как они кажутся, поскольку вы используете lw - тогда они будут разделены на 4 байта. Поэтому вам нужно умножить свой индекс на 4, чтобы получить правильный адрес. Это может быть сделано с помощью sll инструкции:

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

Кстати, это ненужно использовать div, когда вы деление на степени 2. Вы можете использовать srl вместо (или sra если вы хотите, подписанное подразделение):

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

Вы можете прочитать больше о Bitshift операций on Wikipedia.

+0

Привет, да пробелы между ошибкой $ были похожи на опечатку. – Emanoel

Смежные вопросы