2013-06-25 5 views
3

Я видел, что логический сдвиг влево сдвигает форму 1-31 бит. Арифметический правый и логический сдвиг вправо принимают 1 -32 в качестве величины сдвига. Почему разница между правой и левой сменами?Почему логический сдвиг вправо и арифметический сдвиг вправо имеют диапазон сдвига 1- 32

+1

, потому что вы можете взять 0x80000000 и 'shr' 32 раза, чтобы произвести 0. Но взятие' 0x00000001' и выполнение 'lsh' 32 раза просто сбрасывают бит набора из конца int, производя эквивалент целочисленного переполнения. –

+0

укажите набор инструкций –

+0

набор инструкций - это рука v7 – Gautam

ответ

3

Это связано со специальными значениями определенных операций сдвига. Из DDI 0029E (ARM7TDMI техпаспорта):

LSL # 0 является частным случаем, когда рычаг переключения осуществляют это старое значение флага CPSR C. Содержимое Rm используется непосредственно как второй операнд.
....
Форма поля сдвига, которая, как ожидается, должна соответствовать LSR # 0, используется для кодирования LSR # 32, который имеет нулевой результат с битом 31 из Rm в качестве вывода переноса. Логический сдвиг вправо нуль избыточен, так как он совпадает с логическим сдвигом влево, поэтому ассемблер преобразует LSR # 0 (и ASR # 0 и ROR # 0) в LSL # 0 и разрешает LSR # 32 специфическая ред.

Другими словами, разработчики процессоров присваивается специальное значение LSL #0, что также означает, что нет никакой возможности кодирования для LSL #32, так как сдвиг количества 1..31 интерпретируются как есть и 0 имеет особое значение. LSR #0 и ASR #0 будут преобразованы в LSL #0 ассемблере, так как они имеют тот же смысл, что означает, что код кодировки машины для LSR #0 и ASR #0 были свободно использовать что-то другое; поэтому они сделали нулевой сдвиг равным 32 для LSR/ASR.

0

Я полагаю, что это связано с переключением ствола ARM. В основном архитектура ARM не имеет реальной команды переключения. Вместо этого он дает вам возможность выполнять смены как часть других инструкций, используя баррель.

Перед обработкой инструкций, принимающих сдвиг, процессор проверяет, был ли указан сдвиг. Если бы не применялся сдвиг по умолчанию, это LSL # 0.

Теперь сумма, на которую будет сдвигаться регистр, указана либо в 5-битовом поле в инструкции, либо в нижнем байте регистра. Однако использование 5-битного поля не требует дополнительных накладных расходов, а для использования регистра требуется дополнительный цикл.

5 бит дает вам 32 разных значения. Поскольку нам нужно иметь значение 0, если мы не хотим применять какие-либо сдвиги, возможные значения LSL варьируются от 0-31, тогда как LSR и ASR имеют диапазон 1-32, потому что вам никогда не понадобится LSR # 0 или ASR # 0.

Что касается LSR # 32 или ASR # 32, они могут быть полезны, если вы хотите установить регистр либо с нулями, либо с теми, которые знают, что должен был сдвинуть последний бит, поскольку он будет перемещен в бит переноса ,