Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Короткі теоретичні зведення




Розрізняють власне логічні операції, бітові операції і зсув. Вони виробляються над бітами байта або слова, тому ще називаються побітовими (порозрядними).

Логічні команди

Логічне заперечення (NOT, ,) – змінює значення операнда на протилежне

op1 rez приклад
    (op1)=01010101b
    not (op1)=10101010b

 

Логічне множення (кон’юнкція, AND, , ) – результат завжди 0, якщо один з операндів дорівнює 0:

op1 op2 rez приклад
0 0   op1=01010101b
0     and
  0   op2=11001101b
      rez=01000101b

 

Логічне додавання (диз'юнкція, OR, +, ) – результат завжди 1, якщо один з операндів дорівнює 1:

op1 op2 rez приклад
      op1=01010101b
  1   or
1     op2=11001101b
1 1   rez=11011101b

Логічна функція “що виключає або” (“додавання по модулю 2”, XOR, ) – результат завжди 0, якщо обоє операнда рівні:

op1 op2 rez приклад
      op1=01010101b
  1   xor
1     op2=11001101b
1 1   rez=10011000b

 

В асемблері логічні команди реалізують чотири основні операції математичної логіки (таблиця 1):

• логічне заперечення (NOT);

• логічне множення (AND, TEST);

• логічне додавання (OR);

• додавання по модулю 2 (XOR).

Логічне заперечення — це операція одномісна (їй потрібний тільки один операнд), всі інші — двомісні.

Для асемблера, як ми знаємо, поняття тип даних (у тім смислу, як це розуміється в алгоритмічних мовах) не існує. Тому побітові операції застосовуються відповідно до правил математичної логіки до кожного біта окремо, починаючи з молодшого біта і закінчуючи старшим бітом. Для двомісних команд (відповідно до загальноприйнятого в асемблері правилами) відбувається установка (або очищення) відповідних бітів регістра прапорів (+). Можливі сполучення операндів такі ж, як і приведені в таблиці 1. Команда not уміст регістра прапорів не змінює

Таблиця 1. - Логічні команди в асемблері.

Синтаксис     Біти регістра прапорів
OF SF ZF PF CF
AND приймач, джерело   + + +  
TEST приймач, джерело   + + +  
OR приймач, джерело   + + +  
XOR приймач, джерело   + + +  
NOT приймач - - - - -

 

У якості першого операнда використовують регістр мікропроцесора, за винятком сегментного, або комірка пам'яті. Другим операндом може бути регістр мікропроцесора, за винятком сегментного, комірка пам'яті або безпосереднє значення. Не допускається одночасне використання двох комірок пам'яті як операндів.

<Джерело> у логічних командах із двома операндами звичайно іменується маска. Звідси і термін маскування розрядів. Значення маски звичайно беруть або в двійковому, або в шістнадцятирічнім виді. Воно (значення) означає, що у відповідному біті встановлена одиниця (див. табл. 2), відповідно до малюнка 1.

                               
                               
       

 

Рисунок 1. – Формування маски

Таблиця 2. - Шістнадцятирічні маски

Номер біта Значення маски (HEX) Номер біта Значення маски (HEX)
       
       
       
       
       
       
       
       

 

Увага. Логічні команди не мають нічого спільного (у смислі десяткового результату) зі звичними для людини арифметичними операціями. Інтерпретація результату — справа людини, а не комп'ютера (для нього рідними є тільки двійкові числа!).

3.1.1 Використання команд логічного множення AND і TEST

Ці операції звичайно застосовується для перевірки установки потрібних нам розрядів у 1.

Різниця між командами and і test полягає в тім, що команда test використовується для організації логічного порівняння операндів (за аналогією з командою арифметичного порівняння операндів cmp) з наступним умовним переходом, тому вона вміст приймача не змінює.

3.1.2 Використання команди логічного додавання OR

Ця операція звичайно застосовується для установки потрібних нам розрядів у 1.

3.1.3 Використання команди додавання по модулі 2 — X0R

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

3.1.4 Команда логічного заперечення NOT

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

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

Це — інший різновид побітових команд, що переміщають (зрушують) біти в полі операнда приймач, або вліво (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)   Зсув на один розряд
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

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...