Операции сдвига

RCL <операнд1>,<операнд2> – Циклический сдвиг влево через бит переноса

Команда rсl осуществляет сдвиг влево всех битов операнда. Если <операнд2> непосредственное значение сдвиг осуществляется на то количество бит, которое записано в <операнд2>. В младший бит <операнда1> заносится значение флага CF; старший бит <операнда1> загружается в CF

Если <операнд2> регистр CL, тосдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда поступают сначала в CF, а оттуда - в младшие биты <операнда1>

Рисунок 10 – Схема работы команды RCL

В качестве <операнда1> команды rcl можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве <операнда1> непосредственное значение. Команда воздействует на флаги OF и CF.

RCR <операнд1>,<операнд2> – Циклический сдвиг вправо через бит переноса

Команда rсr осуществляет сдвиг вправо всех битов операнда. Если <операнд2> непосредственное значение сдвиг осуществляется на то количество бит, которое записано в <операнд2>. В старший бит <операнда1> заносится значение флага CF; младший бит <операнда1> загружается в CF

Если <операнд2> регистр CL, тосдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда поступают сначала в CF, а оттуда - в старшие биты <операнда1>

Рисунок 11 – Схема работы команды RCR

В качестве <операнда1> можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве <операнда1> непосредственное значение. Команда воздействует на флаги OF и CF.

ROL <операнд1>,<операнд2> – Циклический сдвиг влево

Команда rol осуществляет сдвиг влево всех битов <операнда1>.

Если <операнд2> непосредственное значение сдвиг осуществляется на то количество бит, которое записано в <операнд2>. Старший бит операнда загружается в его младший разряд и одновременно заносится в флаг CF.

Если регистр CL, тосдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты <операнда1> перемещаются в его младшие разряды. Последний перенесенный бит одновременно заносится в флаг CF

Рисунок 12 – Схема работы команды ROL

В качестве <операнда1> можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве <операнда1> непосредственное значение. Команда воздействует на флаги OF и CF.

ROR <операнд1>,<операнд2> – Циклический сдвиг вправо

Команда ROR осуществляет циклический сдвиг вправо всех битов операнда.

Если <операнд2> непосредственное значение сдвиг осуществляется на то количество бит, которое записано в <операнд2>. Младший бит <операнда1> загружается в его младший разряд и одновременно заносится в флаг CF.

Если <операнд2> регистр CL,сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда перемещаются в его старшие разряды. Последний перенесенный бит одновременно заносится в флаг CF

Рисунок 13 – Схема работы команды ROR

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве <операнда1> непосредственное значение. Команда воздействует на флаги OF и CF.

SAL <операнд1>,<операнд2> – Арифметический сдвиг влево

Команда sal осуществляет сдвиг влево всех битов операнда. Старший бит операнда поступает в флаг CF.

Если <операнд2> непосредственное значение сдвиг осуществляется на то количество бит, которое записано в <операнд2>. В младший бит операнда загружается 0.

Если <операнд2> регистр CL, сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие заполняются нулями.

Рисунок 14 –Схема работы команды SAL

В качестве <операнда1> команды sal можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве <операнда1> непосредственное значение.

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

Команда воздействует на флаги OF, SF, ZF, PF и CF.

Аналогично работает команда SHL, имеющая тот же формат. Разница между командами SAL и SHL заключается в том, что команда SHL реализует логический сдвиг, а не арифметический (хотя внешне разницы не будет).

SAR <операнд1>,<операнд2> – Арифметический сдвиг вправо

Команда sar осуществляет сдвиг вправо всех битов операнда. Младший бит операнда поступает в флаг CF.

Если <операнд2> непосредственное значение сдвиг осуществляется на то количество бит, которое записано в <операнд2>. Старший бит операнда сохраняет свое значение.

Если <операнд2> регистр CL, сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда, пройдя через флаг CF, теряются, а старший бит (знак числа) расширяется вправо

Рисунок 15 – Схема работы команды SAR

В качестве <операнда1> можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве <операнда1> непосредственное значение.

Каждый сдвиг вправо эквивалентен делению знакового числа на 2, поэтому команду sar удобно использовать для деления операнда на целые степени 2. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Аналогично работает команда SHR, имеющая тот же формат. Разница между командами SAR и SHR заключается в том, что команда SHR реализует логический сдвиг, а не арифметический что ведет к заполнению старших разрядов нулевыми значениями, а не знаковым разрядом.

Необходимо отметить, что при использовании сдвиговых операций, счетчик числа сдвигов маскируется по 5 младшим разрядам (для 64-х разрядной архитектуры — 6). Это вполне обосновано, поскольку после 31-го сдвига от исходного числа в регистре останется только старший разряд.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: