Команды линейного сдвига
К командам этого типа относятся команды, осуществляющие сдвиг по следующему алгоритму:
очередной “выдвигаемый” бит устанавливает флаг cf;
бит, вводимый в операнд с другого конца, имеет значение 0;
при сдвиге очередного бита он переходит во флаг cf, при этом значение предыдущего сдвинутого бита теряется!
Команды линейного сдвига делятся на два подтипа:
команды логического линейного сдвига;
команды арифметического линейного сдвига.
·
К командам логического линейного сдвига относятся следующие:
операнд,счетчик_сдвигов (Shift Logical Left) - логический сдвиг влево.
Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Справа (в позицию младшего бита) вписываются нули;
операнд,счетчик_сдвигов (Shift Logical Right) — логический сдвиг вправо.
Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчик_сдвигов. Слева (в позицию старшего, знакового бита) вписываются нули. На рис. 1 показан принцип работы этих команд.
Рис. 1. Схема работы команд линейного логического сдвига
Ниже показан фрагмент программы, который выполняет преобразование двух неупакованных BCD-чисел в слове памяти bcd_dig в упакованное BCD-число в регистре al.
... bcd_dig dw 0905h ;описание неупакованного BCD-числа 95 ... mov ax,bcd_dig ;пересылка shl ah,4 ;сдвиг влево add al,ah ;сложение для получения результата: al=95h |
Команды арифметического линейного сдвига отличаются от команд логического сдвига тем, что они особым образом работают со знаковым разрядом операнда.
операнд,счетчик_сдвигов (Shift Arithmetic Left) —
арифметический сдвиг влево.
Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Справа (в позицию младшего бита) вписываются нули. Команда sal не сохраняет знака, но устанавливает флаг cf в случае смены знака очередным выдвигаемым битом. В остальном команда sal полностью аналогична команде shl;
операнд,счетчик_сдвигов (Shift Arithmetic Right) — арифметический сдвиг вправо.
Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчик_сдвигов. Слева в операнд вписываются нули. Команда sar сохраняет знак, восстанавливая его после сдвига каждого очередного бита.
На рис. 2 показан принцип работы команд линейного арифметического сдвига.
Рис. 2. Схема работы команд линейного арифметического сдвига