Индексирование массива MIPS с использованием смещения в lw для известного постоянного индекса? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь перевести из C эту строку кода вложенного массива p=A[B[6]], которую я нашел в книге, из которой я изучаю MIPS.Потому что я почти уверен, что решение из книги неверно или, по крайней мере, намного сложнее, чем нужно.

Базовый адрес массива A [] хранится в регистре $ s1базовый адрес B [] хранится в $ s2, а значение g хранится в $ s0.

Мой перевод p=A[B[6]] будет (скажите, пожалуйста, правильно ли):

lw $t0, 24($s2) #load from memory B[6] in the register $t0
sll $t0, $t0, 2 #$t0=$t0*4
add $t0, $t0, $s1 #add to $t0 the address of A[B[6]]
lw $t0, 0($t0) #$t0=A[B[6]]

Хотя вместо этого книга (которая полна других ошибок) предлагает следующее решение:

addi $t0, $0, 6
sll sll $t0, $t0 2 
add $t1, $s2, $t0 
lw $t2, 0 ($t1)
sll $t2, $t2 2 
add $t3, $s1, $t2
lw $s0, 0 ($t3)

Верен ли мой код или книга верна?

1 Ответ

0 голосов
/ 03 января 2019

Обе версии логически верны;единственная проблема с версией книги состоит в том, что она очень неэффективна.

Не удается оптимизировать, исходя из того факта, что 6 является постоянной времени сборки, поэтому 6*4 может быть немедленным смещением вlw вместо расчета во время выполнения в регистре и добавления к базе отдельно.

lw имеет место для 16 битов немедленного смещения;глупо не использовать и ограничивать себя только использованием 0.По какой-то причине это инструкция I-типа, в которой много места для кодирования выделено для большого смещения.

Кроме того, ваши версии эквивалентны.Версия книги вычисляет 6<<2 в регистре и добавляет ее к основанию B ($s2).Он получает начальный 6 в регистр, добавляя к нулевому регистру.

И ваше, и книга используют add вместо addu.Не уверен, почему вы хотите перехватить подписанное переполнение, особенно при выполнении математики адресов.Компиляторы C обычно всегда используют addu.(Переполнение со знаком - неопределенное поведение в C, но разработчики компилятора знают, что обычно более полезно / ожидаемо для него молча обернуть, чем вызвать исключение.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...