Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л.р.1-12.СПРГ-1(40, укр).doc
Скачиваний:
5
Добавлен:
27.08.2019
Размер:
2.33 Mб
Скачать

3.2. Команди зсуву

Це — інший різновид побітових команд, що переміщають (зрушують) біти в полі операнда приймач, або вліво (Left), або вправо (Right) на визначене число розрядів — це значення зберігається в джерелі. Тому в мнемоніці цих команд обов'язково присутня буква L або R. Усі команди зсувів складаються з двох операндів.

Команди зсувів за принципом дії розділяються на лінійні (арифметичні і логічні зсуви) і циклічні зсуви.

Лінійні команди зсуву додають нуль або в молодший (нульовий) розряд (при зсуві вліво — L), або — у старший (при зсуві вправо — R). Причому старший розряд при зсуві вправо розрізняється для знакових і беззнакових даних. Зсув для знакових даних називається арифметичним, а для беззнакових — логічним. Розряди, що видаляються з операнда, послідовно вміщуються в біт CF регістра прапорів. Ці команди дозволяють дуже швидко виконувати ділення (при зсуві вправо — R) і множення (при зсуві вліво — L) операнда на ступені двійки.

Усі команди зсувів складаються з двох операндів.

Усі команди зсувів і циклічних зсувів використовують прапори переносу CF і переповнення OF.

При виконанні команд зсувів прапор CF завжди містить значення останнього висунутого біта:

• shr — логічний (беззнаковий) зсув вправо;

• shl — логічний (беззнаковий) зсув вліво;

• shld — логічний зсув подвійного слова вліво;

• shrd — логічний зсув подвійного слова вправо;

• sal — арифметичний зсув вліво;

• sar — арифметичний зсув вправо.

Циклічне зсув являє собою операцію зсув, при якій висунутий біт займає розряд, що звільнився:

• ror — циклічний зсув вправо;

• rol — циклічний зсув вліво;

• rcr — циклічний зсув вправо з переносом;

• rcl — циклічний зсув вліво з переносом.

Таблиця 3. - Можливі сполучення операндів для команд зсувів.

Приймач

Джерело (лічильник)

Пояснення

reg (mem)

1

Зсув на один розряд

reg (mem)

cl

Кількість розрядів, що зрушуються, знаходиться в регістрі < CL > = [0..31]

reg (mem)

imm8

Кількість розрядів, що зсуваються, знаходиться в константі imm8 = [2..31]. Операція визначена, починаючи з i286.

Як було підкреслено раніше, зсув вліво часто використовується для множення числа на ступінь двійки, а зсув вправо — для ділення на ступінь двійки. Такі операції виконуються значно швидше, ніж звичайні команди множення або ділення. При діленні навпіл непарних чисел результатом стають значення, округлені в меншу сторону. Наприклад, ділення чисел 5 або 7 на 2 дає результат 2 і 3 відповідно, і, крім цього, прапор CF встановлюється в 1. Більш того, при виконанні, наприклад, зсуву на 2 біти більш ефективним є використання двох команд зсуву, а не однієї команди з попереднім завантаженням регістра CL значенням 2. Для перевірки біта переносу (прапора CF) по закінченні операції можна виконати команду jc.

Логіка роботи команд зсув приведена на рисунках 2-9.

Рисунок 2 - Логіка роботи команди арифметичного зсув вліво sal

Рисунок 3 - Логіка роботи команди арифметичного зсув вправо sar

Рисунок 4 - Логіка роботи команди логічного зсув вліво shl

Рисунок 5 - Логіка роботи команди логічного зсув вліво shr

Рисунок 6.- Логіка роботи команди простого циклічного зсув вліво rol

Рисунок 7- Логіка роботи команди простого циклічного зсув вправо ror

Рисунок 8.- Логіка роботи команди циклічного зсув вліво rcl — через біт CF

Рисунок 9.- Логіка роботи команди циклічного зсув вліво rcr — через біт CF

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]