Дело в том, что МП 8086 может выполнить сдвиг на один разряд
или сразу на несколько. Это определяет разряд D9 в КОП. Рассмотрим
случаи для различных значений V.
а) V=0; сдвиг на 1 разряд (i=1). Обязательная форма ассемблера
(примеры):
1) ROL BX,1; (содержимое BX сдвинуть циклически влево на
1 разряд);
2)SHL BYTE [1CD0],1 (содержимое ячейки ОЗУ с адресом
1CD0 сдвинуть арифметически влево на 1 разряд);
б) V=1; сдвиг на число разрядов, где число по умолчанию берется
из регистра CL (i=CL). Обязательная форма ассемблера (примеры):
1) RСL AX,CL; (Содержимое AX сдвинуть циклически влево
на число разрядов, где число сдвигов n=<CL>;
2) SHL WORD [1CD0],CL (содержимое слова, хранящегося в
ячейках памяти M1CD1, M1CD0 , сдвинуть арифметически влево на
число разрядов, где число сдвигов n=<CL>.
Сформулируем краткие характеристики к схемам (таблица 4)
выполнения команд сдвига, учитывая, что указанные схемы практически
полностью отражают действия команд.
Команды 3-й и 4-й строчки отличаются от 1-й и 2-й тем, что в
команде циклического сдвига появляется дополнительный разряд : CF.
Это свойство позволяет, в случае необходимости, спрятать один бит
слова в CF, произвести нужные операции над оставшейся частью слова
и вернуть обратным сдвигом спрятанный бит в CF на место.
В частности, это можно использовать при преобразовании
отрицательного числа из прямого кода в дополнительный и наоборот.
Нижние четыре строчки таблицы касаются арифметических
сдвигов. Причем, тип команды: 110
2
— формальный, а результаты ее
выполнения — бессмысленны. А вот нижняя команда используется
достаточно часто.
Из схемы следует, что тип 111
2
отличается от типа 101
2
тем, что
вместо нулей при арифметическом сдвиге вправо освобождающиеся
разряды заполняются содержимым старшего бита. А учитывая, что в
старшем бите у чисел со знаком находится знак (вспомним, что «+» = 0,
«-» = 1), то этот тип сдвига, сохраняя знак, сдвигает само число вправо.
При этом, если число положительное, то освобождающиеся разряды
заполняются нулями (после знака). А если отрицательное число, то —
единицами. При преобразовании числа в прямой код эти единицы
превращаются в нули.
Пример 3 — Пусть в регистре XD находятся данные OFFE.
Сдвинуть арифметически это число влево на 3 разряда.
Ответ: Составляем программу в ассемблере:
MOV CL, 03; Задаем в CL число сдвигов
SHL DX, CL; и сдвигаем <DX> влево.
37