почему мне нужно sll добавить четыре нуля в $t1, я не понимаю необходимости умножать $s3 на 2 дважды, используя sll
код c
while (save[i]==k)
i+=1;
поместите i в $ s3, k в $ s5 и адрес k в $ s6
код mips
loop: sll $t1, $s3, 2
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
j loop
Exit:
1 ответ
Ваш массив/указатель должен быть какого-то 4-байтового типа (
int
с?). Поэтому для загрузки
save[i]
из памяти индекс необходимо преобразовать в байтовое смещение внутри массива, а затем добавить к базовому адресу этого массива. Это делается путем умножения
i
на четыре:
sll $t1, $s3, 2
а затем добавление
save
:
add $t1, $t1, $s6
Однако это не похоже на оптимизированную сборку. Обычно компилятор может переписать этот код, чтобы продвигать временный указатель напрямую с шагом четыре, таким образом избегая двух инструкций в этом цикле.