почему мне нужно 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

Однако это не похоже на оптимизированную сборку. Обычно компилятор может переписать этот код, чтобы продвигать временный указатель напрямую с шагом четыре, таким образом избегая двух инструкций в этом цикле.

Другие вопросы по тегам