почему мне нужно, чтобы sll добавил четыре нуля в $t1, я не понимаю необходимости умножать $s3 на 2 дважды, используя sll

#arrays #c #assembly #mips #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. Чтобы ответить на этот вопрос, нам нужно ознакомиться с декларациями i И. save

2. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Ответ №1:

Ваш save массив/указатель должен быть какого-то 4-байтового типа ( int ов?). Поэтому для загрузки save[i] из памяти индекс i необходимо преобразовать в смещение в байтах внутри массива, а затем добавить к базовому адресу этого массива. Это делается путем умножения i на четыре:

 sll $t1, $s3, 2  

а затем добавила save :

 add $t1, $t1, $s6  

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

Комментарии:

1. Действительно, цикл в вопросе действительно неэффективен и мог бы использовать lw / add (приращение указателя) / bne loop_top на поддельном MIPS без слотов задержки ветвления, чтобы, по крайней мере, скрыть некоторую задержку загрузки и избежать безусловной ветви.

2. @PeterCordes Я на самом деле не знаю набора инструкций MIPS, но это выглядело неоптимизированным даже на мой взгляд 🙂