Зачем немного сдвигать, используя sll и тому подобное в MIPs Assembly?

Так что я немного понимаю, что делает команда sll, когда я читаю это, и это в значительной степени просто сдвигает все биты, оставленные на 1. Мне просто интересно, зачем мне это делать?

У меня есть назначение из класса с примером этого... Где $s6 и $s7 - это базовый адрес для массива, а $s1/$s2 - это только некоторые переменные.

sll $t0, $s0, 2
add $t0, $s6, $t0
sll $t1, $s1, 2
add $t1, $s7, $t1
...

Зачем немного сдвигаться? Что он делает простыми словами? Сначала я подумал, что это связано с индексацией переменных в массиве... но я не уверен.

3 ответа

Решение

это в значительной степени просто сдвигая все биты, оставленные 1

Пример, который они показали, был сдвиг на 1 бит. sll инструкция не ограничивается просто сдвигом на 1 бит; Вы можете указать величину сдвига в диапазоне 0..31 (сдвиг на 0 может показаться бесполезным, но SLL $zero, $zero, 0 используется для кодирования NOP на MIPS).

Логический сдвиг влево на N биты могут быть использованы в качестве быстрого средства умножения на 2^N (2 в степени N). Итак, инструкция sll $t0, $s0, 2 умножается $s0 на 4 (2^2) и переписывается $t0, Это полезно, например, при масштабировании смещений, которые будут использоваться при доступе к массиву слов.

Сдвиг числа один бит влево - это то же самое, что умножение этого числа на 2. В более общем смысле, сдвиг числа N бит влево - это то же самое, что умножение этого числа на 2^N.

Он широко используется для вычисления смещения массива, когда каждый элемент массива имеет степень, равную 2.

Я вижу в программе простой sll, примененный к регистрам $s0 и $s2! В инструкции sll $t0, $s0, 2 значение регистра $s0 будет умножено на 4. Вы можете очистить больше в логическом примере Shift left

Другие вопросы по тегам