Линейный сдвиг

К командам этого типа относятся команды, осуществляющие сдвиг по следующему алгоритму:

  • Очередной «выдвигаемый» бит устанавливает флаг cf;
  • Бит, вводимый в операнд с другого конца, имеет значение 0;
  • При сдвиге очередного бита он переходит во флаг cf, при этом значение предыдущего сдвинутого бита теряется!

Команды линейного сдвига делятся на два подтипа:

  • Команды логического линейного сдвига;
  • Команды арифметического линейного сдвига;

К командам логического линейного сдвига относятся следующие:

            Shlоперанд, счетчик_сдвигов (ShiftLogicalLeft) – логический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Справа (в позицию младшего бита) вписываются нули;

            Shrоперанд, счетчик_сдвигов (ShiftLogicalRight) – логический сдвиг вправо. Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчик_сдвигов. Слева (в позицию старшего, знакового бита) вписываются нули.

Команды арифметического линейного сдвига отличаются от команд логического сдвига тем, что они особым способом работают со знаковым разрядом операнда:

            Salоперанд, счетчик_сдвигов (ShiftArithmeticLeft) – арифметический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Справа (в позицию младшего бита) вписываются нули. Команда salне сохраняет знака, но устанавливает флаг cf случае смены знака очередным выдвигаемым битом. В остальном команда sal полностью аналогично команде shl;

            Sar операнд, счетчик_сдвигов(Shift Arithmetic Right) – арифметическийсдвигвправо. Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчика_сдвигов. Слева в операнд вписываются нули. Команда sarсохраняет знак, восстанавливая его после сдвига каждого очередного бита.

Команды арифметического сдвига позволяют выполнить умножение и деление операнда на степени двойки. Посмотрите на двоичное представление чисел 75 и 150:

75        01001011

150      10010110

Второе число является сдвинутым влево на один разряд первым числом. Если вас еще есть сомнения, проделайте несколько умножений на 2, 4, 8 и т.д. =)

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

Циклический сдвиг

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

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

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

            Rolоперанд, счетчик_сдвигов (RotateLeft) – циклический сдвиг влево. Содержимое операнда сдвигается влево на количество бит, определяемое операндом счетчик_сдвигов. Сдвигаемые влево биты записываются в тот же операнд справа;

            Rorоперанд, счетчик сдвигов (RotateRight) – циклический сдвиг вправо. Содержимое операнда сдвигается вправо на количество бит, определяемое операндом счетчик_сдвигов. Сдвигаемые вправо биты записываются в тот же операнд слева.

Команды циклического сдвига через флаг переноса cfотличаются от команд простого циклического сдвига тем, что сдвигаемый бит не сразу попадает в операнд с другого его конца, а записывается сначала во флаг переноса cf. Лишь следующее исполнение данной команды сдвига (при условии, что она выполняется в цикле) приводит к помещению выдвинутого ранее бита в другой конец операнда. К командам циклического сдвига через флаг переноса cfотносятся следующие:

Rclоперанд, счетчика_сдвигов (rotatethroughcarryleft) – циклический сдвиг влево через перенос.  Содержимое операнда сдвигается влево на количество бит, определяемое операндом счетчик_сдвигов. Сдвигаемые биты поочередно становятся значением флага переноса cf;

Rcrоперанд, счетчика_сдвигов (rotatethroughcarryright) – циклический сдвиг вправо через перенос. одержимое операнда сдвигается вправо на количество бит, определяемое операндом счетчик_сдвигов. Сдвигаемые биты поочередно становятся значением флага переноса cf.

лежать в диапазоне 0..31. Это значение может задаваться непосредственным операндом или содержаться в регистре cl. Значение операнд_2 не изменяется;

Ссылка на основную публикацию
Adblock detector