Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
64
Добавлен:
09.12.2018
Размер:
1.15 Mб
Скачать

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

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

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

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

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

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

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

Флаг cf 7 6 5 4 3 2 1 0

Команды циклического сдвига могут быть полезны при взаимном обмене между младшими старшими разрядами регистра.

Например.

move eax, FFFF0000h

mov cl,16

rol eax,cl ;получим eax=0000FFFF

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

7 6 5 4 3 2 1 0 Флаг cf

Пример использования команды простого циклического сдвига для подсчета числа единиц в операнде.

…………..

mov dx,0

mov cx,32 ;параметр цикла (число сдвигов)

cycl:

ror eax,1

jnc m1 ;если флаг cf=0, то на m1

inc dx ;иначе добавить в счетчик единиц

m1:

loop cycl

………..

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

Отличие от команд простого циклического сдвига в том, что сдвигаемый бит не сразу попадает на вход операнда, а задерживается на один шаг во флаге переноса CF.

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

cf

7 6 5 4 3 2 1 0

rcr операнд, счетчик_команд – циклический сдвиг вправо.

cf

7 6 5 4 3 2 1 0 Флаг cf

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

Пример.

Извлечь из регистра EAX старшую половину с одновременным ее обнулением и записать извлеченные биты в регистр BX.

Исходное состояние: eax=f f f f a a a a

bx=0000

mov cx,16

m1:

clc ;сброс флага cf

rcl eax,1 ;в результате сдвигов получим: eax=a a a a 0000

rcl bx,1 ; bx=f f f f

loop m1

rol eax,16 ; eax=0000 a a a a

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]