Не понимая цели левого сдвига в этой проблеме - PullRequest
0 голосов
/ 04 октября 2018

Я новичок в MIP, и у меня возникло недоразумение по поводу решения этой проблемы.Я попытался прочитать различные источники, и ни один из них действительно не объяснил, как было получено смещение или зачем это нужно.

Для следующего оператора C, каков соответствующий код сборки MIPS?Предположим, что переменные i и j присвоены регистрам $ s3 и $ s4 соответственно.Предположим, что базовые адреса массивов A и B находятся в регистрах $ s6 и $ s7, соответственно.

Проблема в следующем: B [8] = A [i - j];

Решение:

sub $ t0, $ s3, $ s4

sll $ t0, $ t0, 2

add $ t1,$ s6, $ t0

lw $ t2, 0 ($ t1)

sw $ t2, 32 ($ s7)

Я не понимаю, почему этот левый сдвигнужен после вычитания из i и j.Я понимаю, что это сдвигает результат i и j на 4 бита, но зачем это нужно?

1 Ответ

0 голосов
/ 04 октября 2018

Сдвиг влево необходим для вычисления смещения элемента A[i-j].

Каждый элемент массивов A и B имеет ширину 32 бита (4 байта).Но MIPS имеет байтовую адресацию, поэтому каждому элементу массива требуется 4 адреса.

Сдвигая 2 бита влево, вы фактически умножаете на 4. Так (ij) * 4 - это смещение i-j '-ого элементамассива.Это также является причиной того, что последняя строка вашего кода sw $t2, 32($s7), которая сохраняет результат в восьмом элементе массива, использует 32 в качестве смещения.

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