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