Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура ВС-пособие.docx
Скачиваний:
8
Добавлен:
01.05.2025
Размер:
728.99 Кб
Скачать

Команды сдвига

Команды этой группы также обеспечивают манипуляции над отдельными битами операндов, но иным способом, чем логические команды, рассмотренные выше. Все команды сдвига перемещают биты в поле операнда влево или вправо в зависимости от кода операции.

Все команды сдвига имеют одинаковую структуру:

Коп операнд, счетчик_сдвигов

Как видите на месте второго операнда располагается значение счетчика сдвигов. Количество сдвигаемых разрядов - счетчик_сдвигов может задаваться двумя способами:

  • статически, что предполагает задание фиксированного значения с помощью непосредственного операнда;

  • динамически, что означает занесение значения счетчика сдвигов в регистр CL перед выполнением команды сдвига.

Значение счетчика сдвигов должно быть целым числом без знака, да к тому же и лежать в разумных пределах (в последних публикациях указывается ограничение, равное 31. Правда, говорится, что оно может быть и большим, до 255, но команды сдвига воспринимают из этого значения- источника только младшие 5 двоичных разрядов).

Все команды сдвига устанавливают флаг переноса cf.

По мере сдвига битов за пределы операнда они сначала попадают на флаг переноса, устанавливая его равным значению очередного бита, оказавшегося за пределами операнда. Куда этот бит попадет дальше, зависит от типа команды сдвига и алгоритма программы.

По принципу действия команды сдвига можно разделить на два типа:

команды линейного сдвига;

команды циклического сдвига.

Команды линейного сдвига

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

  • очередной “выдвигаемый” бит устанавливает флаг cf;

  • бит, вводимый в операнд с другого конца, имеет значение 0;

  • при сдвиге очередного бита он переходит во флаг cf, при этом значение предыдущего сдвинутого бита теряется!

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

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

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

SHL операнд, счетчик_сдвигов -логический сдвиг влево

– каждый бит операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Освобождаемые позиции в младших разрядах заполняются нулями. Если представить эту операцию как серию сдвигов на 1 позицию, то старший разряд перед последним сдвигом попадает во флаг CF.

0

CF

SHR операнд, счетчик_сдвигов - логический сдвиг вправо

– каждый бит операнда сдвигается вправо на количество битов, определяемое значением счетчик_сдвигов. Освобождаемые позиции в старших разрядах заполняются нулями. Если представить эту операцию как серию сдвигов на 1 позицию, то младший разряд перед последним сдвигом попадает во флаг CF.

0

CF

SАL операнд, счетчик_сдвигов арифметический сдвиг влево

– каждый бит операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Освобождаемые позиции в младших разрядах заполняются нулями. Знак операция не сохраняет, но устанавливает в 1 флаг CF, если изменяется знаковый разряд очередным сдвигаемым битом, поэтому на приведенной ниже иллюстрации команды связь с флагом обозначена прерывистой линией.

0

CF

SАR операнд, счетчик_сдвигов арифметический сдвиг вправо

– каждый бит приемника сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Команда сохраняет знак операнда-приемника, восстанавливая его после сдвига каждого очередного бита.

CF

Все описанные команды позволяют умножать (при сдвиге влево) или делить (при сдвиге вправо) значение источника на степени числа 2. При этом скорость выполнения команд сдвига намного больше, чем скорость операций умножения или деления.