Зачем немного сдвигать, используя 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