Команды сдвигов и циклических сдвигов

Эти команды также обеспечивают манипуляции над отдельными битами, перемещая биты операнда влево или вправо на определенное число битов, в зависимости от кода операции. Количество битов, на которое выполняется сдвиг, определяется счетчиком сдвигов CNT. Значение счетчика может задаваться статически (непосредственно во втором операнде) или динамически (в регистре CL перед выполнением команды сдвига). Счетчик сдвигов может содержать значение в диапазоне от 0 до 31; современные процессоры могут выполнять 64- разрядные сдвиги.

В командах сдвига влево с правой стороны операнда «вдвигаются» нули, а старшие биты «выдвигаются» с левой стороны и теряются, но последний из них сохраняется во флаге CF. Команды сдвига вправо аналогичным образом сдвигают биты вправо. Но арифметический сдвиг вправо не помещает слева нули, а дублирует в старшие биты знак операнда. Команды циклического сдвига отличаются от команд сдвига тем, что операнд считается «кольцом», в котором выдвигаемые с одной стороны вдвигаются с другой стороны. Их описание представлено в таблице 4.9.

Таблица 4.9 - Формат команд сдвигов и циклических сдвигов

Название команды Мнемоника и формат команды Описание действия
Сдвинуть логически влево SHL OPR,CNT  
Сдвинуть арифметически влево SAL OPR,CNT Не сохраняет знака, но устанавливает флаг OF в случае смены знака очередным выдвигаемым битом. В остальном полностью аналогична команде SHL.
Сдвинуть логически вправо SHR OPR,CNT  

Сдвинуть арифметически вправо SAR OPR,CNT   Сохраняет знак, восстанавливая его после сдвига каждого очередного бита. В остальном – аналогична команде SHR.
Сдвинуть циклически влево ROL OPR,CNT
Сдвинуть циклически вправо ROR OPR,CNT
Сдвинуть циклически влево через перенос RCL OPR,CNT
Сдвинуть циклически вправо через перенос RCR OPR,CNT

Команды арифметического сдвига позволяют выполнить «быстрое» умножение и деление операнда на степени двойки. Например, сдвиг числа влево на один разряд аналогичен его умножению на 2 (или на 10 в десятичной системе счисления). В командах циклического сдвига сдвигаемые биты поочередно становятся значением флага переноса CF.

Флажки SF, ZF, PF модифицируются командами сдвига, но команды циклических сдвигов на них не воздействуют. Флажок OF имеет смысл, если только счетчик равен 1. Команды сдвигов влияют на состояние флажка АF, но оно определенного смысла не имеет.

Что касается режимов адресации, то OPR может иметь любой режим адресации, кроме непосредственного.