2015-02-19 6 views
3

У меня есть вопрос домашнее задание, который спрашивает:При использовании набора инструкций 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). Если я не ошибаюсь, это эквивалентно второму блоку кода.

+3

вы абсолютно правильно. Любой приличный оптимизирующий компилятор будет делать именно то, что вы указали , –

ответ

0

Я думаю, ответ в том, что даже если оба фрагменты кода дают одинаковые результаты, т.е.

ADDI $t0, $zero, 8 
    SLL $t0, $t0, 2 
    ADD $t0, $t0, $s7 
    SW $t1, 0($t0) # $t1 is Stored in B[8] 

и

SW $t1, 32($s7) # $t1 is Stored in B[8] 

первый один потребляет больше циклов процессора.

Любой простой компилятор сможет выпустить первый фрагмент кода, поскольку это прямой перевод инструкции высокого уровня B[8] = result_of_calculation.

Второй кусок кода нуждается в небольшом статическом анализе (т.е. компилятор должен учитывать, что $s7 содержит базовый адрес массива B, а также учитывает, что вы адресуете восемь местоположений такого массива.

Я думаю, что любой современный компилятор выполнить что минимальный статический анализ и, следовательно, будет выдавать вторую команду вместо первого фрагмента кода.