#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, но это выглядело неоптимизированным даже на мой взгляд 🙂