Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура ВС-пособие.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
728.99 Кб
Скачать

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

К командам циклического сдвига относятся команды, сохраняющие значения сдвигаемых бит. Есть два типа команд циклического сдвига:

команды простого циклического сдвига;

команды циклического сдвига через флаг переноса cf.

К командам простого циклического сдвига относятся:

ROL операнд,счетчик_сдвигов (Rotate Left) — циклический сдвиг влево.

ROR операнд,счетчик_сдвигов (Rotate Right) — циклический сдвиг вправо.

Циклический сдвиг ROL и ROR отличается от логического тем, что выдавливаемые за пределы разрядной сетки биты операнда-приемника записываются в него же на освобождаемые справа или слева позиции. Последний выдавливаемый справа или слева разряд записывается во флаг CF.

CF

Команды циклического сдвига через флаг переноса отличаются от предыдущих тем, что выдавливаемые биты становятся значением флага CF и только на следующем выполнении этих команд (при условии, что они выполняются в цикле) бит из флага CF заносится в младший или старший биты операнда-приемника.

RCL операнд, счетчик_сдвигов -циклический сдвиг влево через перенос.

RCR операнд, счетчик_сдвигов -циклический сдвиг вправо через перенос.

CF

Занесение бита после предыдущего сдвига

Можно использовать команды циклических и обычных сдвигов для умножения и деления чисел в формате двойного слова на степени двойки. Рассмотрим 32-битовое число, в котором старшие 16 бит хранятся в DX, а младшие – в AX.

Инструкции для умножения этого числа таковы:

SHL AX,1 ;сдвигаем все биты влево, а старший – в CF

RCL DX,1 ;помещаем бит из CF в DX, предварительно сдвинув все биты регистра влево.

Для деления на 2 этого числа нужно применить команды:

SAR DX,1 ;сдвигаем биты вправо, а младший – в CF

RCR AX,1 ;все биты АХ сдвигаем вправо, а на освободившееся место записываем выдвинутый на предыдущем шаге бит из DX.

Дополнительные команды сдвига

Система команд последних моделей микропроцессоров Intel, начиная с i80386, содержит дополнительные команды сдвига, расширяющие возможности, рассмотренные нами ранее.

Это — команды сдвигов двойной точности:

shld операнд_1,операнд_2,счетчик_сдвигов — сдвиг влево двойной точности.

Команда shld производит замену путем сдвига битов операнда операнд_1 влево, заполняя его биты справа значениями битов, вытесняемых из операнд_2. Количество сдвигаемых бит определяется значением счетчик_сдвигов, которое может лежать в диапазоне 0...31. Это значение может задаваться непосредственным операндом или содержаться в регистре cl. Значение операнд_2 не изменяется.

shrd операнд_1,операнд_2,счетчик_сдвигов — сдвиг вправо двойной точности.

Команда производит замену путем сдвига битов операнда операнд_1 вправо, заполняя его биты слева значениями битов, вытесняемых из операнд_2. Количество сдвигаемых бит определяется значением счетчик_сдвигов, которое может лежать в диапазоне 0...31. Это значение может задаваться непосредственным операндом или содержаться в регистре cl. Значение операнд_2 не изменяется.

Как мы отметили, команды shld и shrd осуществляют сдвиги до 32 разрядов, но за счет особенностей задания операндов и алгоритма работы эти команды можно использовать для работы с полями длиной до 64 бит.