Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
468028.rtf
Скачиваний:
9
Добавлен:
09.11.2019
Размер:
701 Кб
Скачать
☆

Команды циклического сдвига: rol и ror, rcl и rcr.

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

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

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

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

ROL (Rotate Left) - циклический сдвиг влево.

ROR (Rotate Right) - циклический сдвиг вправо.

Синтаксис: ROL dst, countdst, count

Содержимое операнда dst сдвигается влево / вправо на количество бит, определяемое операндом count. Сдвигаемые влево / вправо биты записываются в тот же операнд справа / слева. Схема работы команд простого циклического сдвига показана на рисунке 6.3.

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

Произвести обмен старшей и младшей половинок операнда размером в байт и слово.

data_8 db 0Fh_16 dw 1234hal, 26hal, 4val_8, 4ax, 0203hax, 8 val_16, 8

К командам циклического сдвига через флаг переноса CF относятся следующие:

RCL (Rotate through Carry Left) - циклический сдвиг влево через перенос;

RCR (Rotate through Carry Right) - циклический сдвиг вправо через перенос.

Синтаксис: RCL dst, count

RCR dst, count

Содержимое операнда dst сдвигается влево / вправо на количество бит, определяемое операндом count. Сдвигаемые биты поочередно становятся значением флага переноса CF. Схема работы команд циклического сдвига через флаг переноса CF показана на рисунке 6.4.

Использование логических и арифметических команд сдвига.

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

Сдвиг двоичного числа на k разрядов влево - это приписывание справа k двоичных нулей, т.е. умножение на 2 k. Например, при сдвиге числа 5 на 3 разряда влево получаем:

=101b -> 101000b = 40 = 5*2 3

Это же верно и для отрицательных чисел, представленных в дополнительном коде. Например, при сдвиге числа -4 на 1 разряд влево получаем:

доп (-4) = 11111100b -> 11111000b = 100h-8 = доп (-8)

В общем случае умножение на 2 k реализуется так:

MOV CL, kdst, CL

При этом надо учитывать, что все это верно, только если результат сдвига умещается в ячейку. Например, путем сдвига можно реализовать умножение на 2 всех беззнаковых чисел, меньших 128, и всех знаковых чисел от -64 до +63.

Сдвиг на k разрядов вправо - это отбрасывание последних k разрядов, что соответствует получению неполного частного (операции div) от деления на 2 k. Например, при сдвиге числа 18 на 3 разряда вправо получаем:

= 10010b-> 10b = 2 = 18 div 2 3

Однако так можно реализовать операцию деления нацело только для беззнаковых чисел, для отрицательных чисел это не проходит. Поэтому имеем:

CL, kdst, CL

. Команда SAR может быть использована для быстрого получения неполного частного при делении знаковых чисел на степени 2. Однако эта операция отличается от той, что реализуется командой IDIV: команда IDIV округляет частное в сторону 0, а SAR округляет в сторону минус бесконечности. Например, при делении -1 на 2 (т.е. при частном -0.5) команда IDIV выдаст ответ 0, а команда SAR - ответ -1:

MOV AL, -1; AL=11111111bAL, 1; AL=11111111b (-1)

. Команды циклического сдвига обычно используются для перестановки частей содержимого ячейки или регистра. Например, поменять местами правую и левую половины регистра AL можно циклическим сдвигом этого байта на 4 разряда влево (или вправо):

MOV AL, 17h; AL=00010111bCL, 4AL, CL; AL = 01110001b = 71h

. Команды циклического сдвига через перенос RCL и RCR обычно используются при переносе битов из одного регистра (или переменной) в другой. Например, сдвинуть на 3 разряда влево значения регистров AL и DH, приписав справа к AL три левых бита регистра DH, можно так:

MOV СХ, 3: SHL DH, 1 AL, 1

LOOP L

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