У меня есть вопрос домашнее задание, который спрашивает:При использовании набора инструкций MIPS, почему было бы выгоднее использовать сдвиг влево, а не использовать смещение в слове load/store?
Предположим, что переменные f
, g
, h
, i
и j
присвоенные регистры $s0
, $s1
, $s2
, $s3
и $s4
соответственно. Предположим, что базовый адрес массивов A
и B
находятся в регистрах $s6
и $s7
соответственно.
B[8] = A[i–j];
Для инструкции C выше, что представляет собой соответствующий код сборки MIPS?
Ответ:
SUB $t0, $s3, $s4
SLL $t0, $t0, 2
ADD $t0, $t0, $s6
lw $t1, 0($t0) # A[i - j] in is $t1
и
ADDI $t0, $zero, 8
SLL $t0, $t0, 2
ADD $t0, $t0, $s7
SW $t1, 0($t0) # $t1 is Stored in B[8]
Мой вопрос, почему даже заморачиваться с первых 3-х строк во втором блоке кода? Если вы знаете, что $t1
хранится в восьмом элементе array B
, тогда требуется только одна команда: SW $t1, 32($s7)
. Если я не ошибаюсь, это эквивалентно второму блоку кода.
вы абсолютно правильно. Любой приличный оптимизирующий компилятор будет делать именно то, что вы указали , –