(Rotate operand through Carry flag Right)
Циклический сдвиг операнда вправо через флаг переноса
Схема команды:
| rcr операнд,количество_сдвигов
|
Назначение: операция циклического сдвига операнда вправо через флаг переноса cf.
Синтаксис
Алгоритм работы:
- сдвиг всех битов операнда вправо на один разряд; при этом младший бит операнда становится значением флага переноса cf;
- одновременно старое значение флага переноса — в операнд слева и становится значением старшего бита операнда;
- указанные выше два действия повторяются количество раз, равное значению второго операнда команды rcr.
Состояние флагов после выполнения команды:
Здесь обозначение ?r означает то, что анализ состояния флага имеет смысл при определенном сочетании операндов. В случае команды rcr флаг of представляет интерес, если сдвиг осуществляется на один разряд (см. ниже описание применения команды rcr).
Применение:
Команда rcr используется для циклического сдвига разрядов операнда вправо. Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда. В это время можно произвести его извлечение и (или) подмену. Другой важный момент заключается в том, что для счетчика сдвига микропроцессор использует только пять младших разрядов операнда количество_разрядов. Таким образом, значение, большее 31, не допускается (аппаратно это ограничение реализуется тем, что игнорируются значения битов счетчика старше пятого). Обратите внимание на еще один интересный эффект, связанный с поведением флага of, — его значение имеет смысл только в операциях сдвига на один разряд и обусловлено тем, что по изменению этого флага можно судить о факте изменения знакового разряда операнда:
- of=1, если текущие (то есть до операции сдвига) значения флага cf и старшего, левого бита операнда различны;
- of=0, если текущие (то есть до операции сдвига) значения флага cf и старшего, левого бита операнда слева совпадают.
;подсчет числа единичных битов в операндеoperand dw ...... mov cx,16 ;размер операнда xor al,al ;счетчик единичных битовcycl: rcr operand,1 jc $+4 ;переход, если очередной выдвинутый бит равен 1 jmp $+4 ;переход, если очередной выдвинутый бит равен 0 inc al ;увеличить счетчик единичных битов loop cycl |
См. также: урок 9 и команды rcl, rol, ror, sal, sar, shl, shr