2013-10-04 5 views
0

Код сборки foolowing приведен в моем учебнике.Код сборки MIPS в цикле

Loop: 
sll $t1, $t0, 2 
add $t2, $a0, $t1 
sw $zero, 0($t2) 

addi $t0, $t0, 1 
slt $t3, $t0, $a1 
bne $t3, $zero, Loop 

# return where we were 
jr $ra 

Из этого кода у меня есть два вопроса. Первый вопрос касается второй строки сверху. Получаю, что инструкция sll: сдвиг влево логический, который сдвигает бит влево. Поскольку сумма сдвига равна 2, она будет делать 0000 -> 0100 = 4 в десятичной системе. Но я не получаю его после первого цикла. Если мы сдвинем это налево на 2, разве это не умножено на более чем 4? И второй вопрос в том, можно ли оптимизировать этот код? По-моему, я могу изменить sll и добавить части в код, но я не уверен. Любые комментарии?

ответ

0

Сдвиг влево вставляет 0, а не 1. Так 0000 все равно будет 0000, 0001 станет 0100 после смены

0

[it it] можно оптимизировать этот код?

Более компактный способ сделать то же самое будет:

sll $a1, $a1, 2 
addu $a1, $a1, $a0 # $a1 = $a1 * 4 + $a0 
Loop: 
sw $zero, ($a0) 
addiu $a0, $a0, 4 
bne $a0, $a1, Loop 

Я делаю эти предположения:

  • первоначальные значения $a0 и $a1 не нужны больше после петля заканчивается. Если они нужны, сохраните исходные значения где-нибудь (в других регистрах или в стеке) перед входом в цикл и после этого восстановите их.
  • $t0 начинается с нуля. Если нет, вам нужно добавить $t0 * 4 в $a0 перед циклом. Я также предполагаю, что значение $t0 после выхода из цикла не имеет значения.
0

Рассмотрим следующую бинарную:

0000 0001 

Если вы сдвигают биты влево на 1 разряд вы получите:

0000 0010 

Если вы снова смещена влево на 1 разряд:

0000 0100 

И снова:

0000 1000 

Бинарные значения, указанные выше, эквивалентны 1; 1x2 = 2; 2x2 = 4; 4x2 = 8. Сдвиг бит влево умножает значение на 2^N, если N - количество бит, которое вы смещаете.

Другой пример сдвига:

Assume $t1 contains 0000 1111 

sll $t0, $t1, 3 # $t0 = $t1 * 2^3 

Now $t0 contains 0111 1000 

Вы можете проверить это, выполнив десятичное умножение. 15 * 8 = 120.

Смежные вопросы