Команды циклического сдвига выполняют циклическое перемещение разрядов в байтах, словах и двойных словах. Биты, вытесненные с одного конца операнда, заносятся в него с другого конца. В отличие от команд смещения никакие биты не очищаются в процессе циклического сдвига. Команды циклического сдвига используют только флаги CF и OF. Флаг CF может работать в качестве расширения операнда в двух командах циклического сдвига, позволяющих биту стать обособленным и затем быть проверенным командами условного перехода (JC или JNC). Флаг CF всегда содержит значение последнего бита, вытесненного за пределы операнда в процессе циклического сдвига, даже если команда не использует флаг CF в качестве расширения операнда. Состояние флагов SF, ZF, AF и PF не изменяется. При циклическом сдвиге на один бит флаг OF устанавливается, если операция изменяет самый старший бит (знаковый бит) операнда назначения. Если сохраняется исходное значение знака, флаг OF очищается. После циклического сдвига более чем на один бит значение флага OF не определено.
ROL (Циклический сдвиг влево) циклически сдвигает байт, слово или двойное слово операнда назначения влево на один бит или на количество битов, заданное в операнде-счетчике (непосредственное значение или значение, содержащееся в регистре CL). Для каждого разряда бит, который вытесняется с левого конца операнда, возвращается в правый конец. Смотри Рисунок 3-11. ROR (Циклический сдвиг вправо) циклически сдвигает байт, слово или двойное слово операнда назначения вправо на один бит или на количество битов, заданное в операнде-счетчике (непосредственное значение или значение, содержащееся в регистре CL). Для каждого разряда бит, который вытесняется с правого конца операнда, возвращается в левый конец. Смотри Рисунок 3-12.
RCL (Циклический сдвиг влево через перенос) циклически сдвигает байт, слово или двойное слово операнда назначения влево на один бит или на количество битов, заданное в операнде-счетчике (непосредственное значение или значение, содержащееся в регистре CL). Эта команда отличается от ROL тем, что она интерпретирует флаг CF как однобитовое расширение операнда назначения со стороны старших разрядов. Для каждого разряда бит, который вытесняется с левого конца операнда, перемещается во флаг CF. В тоже время бит, содержащийся во флаге CF, вводится с правой стороны. Смотри Рисунок 3-13.
RCR (Циклический сдвиг вправо через перенос) циклически сдвигает байт, слово или двойное слово операнда назначения вправо на один бит или на количество битов, заданное в операнде-счетчике (непосредственное значение или значение, содержащееся в регистре CL).
Эта команда отличается от ROR тем, что она интерпретирует флаг CF как однобитовое расширение операнда назначения со стороны младших разрядов. Для каждого разряда бит, который вытесняется с правого конца операнда, перемещается во флаг CF. В тоже время бит, содержащийся во флаге CF, вводится с левой стороны. Смотри Рисунок 3-14.
3.4.4.4 Быстрый "bit blt" с использованием команд двойного сдвига
Одним из назначений команд двойного сдвига является реализация перемещения строки битов, с произвольным рассогласованием битовых строк. Это называется "bit blt" (BIT BLock Transfer - пересылка блока битов). Простым примером является перемещение строки битов с произвольного смещения в памяти в выровненную по двойным словам строку байт. Слева направо в строке пересылается 32 бита за один раз, если в цикле пересылки используется двойное смещение.
MOV ESI,ScrAddr MOV EDI,DestAddr MOV EBX,WordCnt MOV CL,RelOffset ; относительное смещение Dest-Src MOV EDI,[ESI] ; загрузить первое слово источника ADD ESI,4 ; увеличить адрес источникаBltLoop: LODS ; новая часть в убывающем порядке ; в EAX SHLD EDX,EAX,CL ; переписать содержимое EDX на ; выровненную вставку XCHG EDX,EAX ; поменять местами старшее и младшее ; слово STOC ; записать очередную выровненную ; часть данных DEC EBX ; уменьшить счетчик цикла JNZ BltLoop
Это простой цикл, позволяющий данным быть перемещенными по 32-разрядным частям с наивысшей возможной скоростью. Без двойного смещения наилучшим результатом, который может быть получен, является 16-разрядная пересылка за цикл с использованием 32-разрядного смещения, и заменой команды XCHG на команду ROR по 16 бит для замены местами старшего и младшего слова в регистрах. Более общий цикл, чем приведен выше, потребует некоторого маскирования первого перемещаемого двойного слова (перед основным циклом), последнего перемещаемого двойного слова (после основного цикла), но будет пересылать те же 32 бита за один цикл, что и программа, приведенная выше.