OR – Logical inclusive OR – логическое включающее ИЛИ.

Ход работы.

  1. Познакомиться с необходимой теоретической информацией.
  2. Ответить на контрольные вопросы.
  3. Выполнить предложенные задания на программирование.
  4. Оформить отчет.
  5. Защитить работу.

Минимально адресуемая единица данных в микропроцессоре – байт. Логические команды позволяют манипулировать отдельными битами. Это единственные команды в системе команд микропроцессора, которые позволяют работать на битовом уровне. Этим, в частности, объясняется их важность. Булевы (логические) команды основаны на операциях булевой алгебры. Эти операции разрешают модификацию отдельных бит в двоичных числах, как показано в таблице:

Операция Описание
AND Результат равен 1, только если оба бита равны 1.
OR Результат равен 1, когда хотя бы один бит равен 1.
XOR Результат равен 1, только когда оба бита разные (исключающее ИЛИ)
NOT Результатом является противоположное значение (1 становится 0, а 0 становится 1)
NEG Получает двоичное дополнение числа.
TEST Выполняется команда AND без записи результат, устанавливаются только флаги.
CMP Сравниваются два операнда, устанавливаются соответствующие флаги.

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

1. Для установки определенных разрядов (бит) применяется команда

OR – Logical inclusive OR – логическое включающее ИЛИ.

OR приемник, маска

Действие: приемник = приемник OR маска.

Команда выполняет операцию логического ИЛИ над соответствующими парами бит операндов приемник и маска.0

Флаги: CF=0, OF=0, PF, AF не определен, ZF, SF.

16-ричный код (1 байт) MOD Reg/OPC Reg/Mem (2-ой байт) смещение disp_Lo, disp_Hi формат операндов: приемник, источник
MOD Reg/OPC Reg/Mem Disp_Lo, Disp_Hi Reg8/Mem8, Reg8
MOD Reg/OPC Reg/Mem Disp_Lo, Disp_Hi Reg16/Mem16, Reg16
0A MOD Reg/OPC Reg/Mem Disp_Lo, Disp_Hi Reg8, Reg8/Mem8
0B MOD Reg/OPC Reg/Mem Disp_Lo, Disp_Hi Reg16, Reg16/Mem16
0C Data8 (непосредств.операнд) отсутствует AL, Immed8
0D Data16 (непосред.операнд) отсутствует AX, Immed16
  MOD 001 Reg/Mem Disp_Lo, Disp_Hi Data Lo Reg8/Mem8, Immed8
  MOD 001 Reg/Mem Disp_Lo, Disp_Hi Data Lo, Data Hi Reg16/Mem16, Imm16
  MOD 001 Reg/Mem Disp_Lo, Disp_Hi Data SX Reg16/Mem16, Imm8

001 - расширение кода операции при работе с непосредственным операндом, размещается в поле Reg/Opc в байте адресации.

Примеры команд:

1. Мнемоническая запись: OR [BP+DI], AH ; формат операндов Mem8, Reg8

Машинный код команды: 00001000 00100011 ; команда занимает 2 байта

16-ричный код команды: 0823h.

2. Мнемоническая запись: OR DH, DH ; формат операндов Reg8, Reg8

Машинный код команды: 0000100011110110 ; команда занимает 2 байта

16-ричный код команды: 08F6h.

3. Мнемоническая запись: OR BX, [SI+12] ;формат операндов Reg16, Mem16

Машинный код команды: 000010110101110000001100 ;команда занимает 3 байта

16-ричный код команды: 0B5C0Ch.

4. Мнемоническая запись: OR AL, -1 ; формат операндов Reg8, imm8

Машинный код команды: 0000110011111111 ; команда занимает 2 байта

16-ричный код команды: 0CFFh.

2. С помощью команды AND можно очищать отдельные биты в операнде-приемнике, при этом защищая (маскируя) оставшиеся биты.

Xor ax, 10b ; инвертировать 1-ый бит в регистре АХ

Jz mes ; переход, если 1-ый бит в АХ был единичным.

TEST приемник, источник

Проверяемые биты приемника в маске (операнд-источник) должны иметь единичное значение. Алгоритм работы команды TEST подобен алгоритму работы команды AND, но он не меняет значение операнда-приемника. Результатом работы является установка значения флага нуля ZF:

· если ZF = 0, то в результате логического умножения получился ненулевой результат, т.е. хотя бы один единичный бит маски совпал с соответствующим единичным битом приемника;

· если ZF = 1, то в результате логического умножения получился нулевой результат, т.е. ни один единичный бит маски не совпал с соответствующим единичным битом приемника.

Например:

Test ax, 0001h

jnz l1 ; переход если 0-ой бит равен 1 (переход, если флаг ZF<>0)

  1. Команда NOT операнд

делает инверсию всех битов исходного операнда, изменяя нули на единицы и наоборот. Результат называется дополнением до единицы. Следующие операнды разрешены:

NOT (NOT operand) – инвертирование всех битов операнда приемник.

NOT регистр

NOT память

Mov al, 11110000b

not al ; AL = 00001111b

  1. Команда NEG операнд

инвертирует знак числа, преобразовывая число в его дополнение до двух. Следующие операнды разрешены:

NEG регистр

NEG память

Подсчет дополнения до двух от числа может быть выполнен путем инверсии всех его битов и суммированием с единицей. После выполнения команды NEG проверьте флаг переполнения OF для определения правильности результата. Например, если поместить в регистр AL отрицательное число -128d, то в результате операции получим -128d (неправильный результат) и OF = 1:

  • mov al, -128 ; AL = 1000 0000b
  • neg al ; AL = 1000 0000b, OF=1

С другой стороны, если инвертировать +127, то результат правильный и OF=0:

  • mov al, +127 ; AL = 0111 1111b
  • neg al ; AL = 1000 0001b, OF=0

Операторы AND, OR, NOT и XOR выполняют поразрядные операции целых чисел во время трансляции. Операнд может быть целой константой или символом. Например, допустимы следующие выражения:

X = 1101101b

Y = X AND 00001111b

Z = X OR 11110000b

Q = NOT Z

W = Y XOR 0FFFFh

OR – Logical inclusive OR – логическое включающее ИЛИ. - student2.ru

OR – Logical inclusive OR – логическое включающее ИЛИ. - student2.ru

6. В следующем примере значение 0000 1111 является битовой маской:

Mov al, 00111011b

and al, 00001111b ; AL = 00001011b

ПРИМЕР задания

1) Определить, является ли целое число степенью 2.

Можно показать, что если ((x — 1) AND x)=0, то х является степенью 2. Двоичные представления числа х, являющегося степенью 2, и соответствующего х-1 приведены на рис.1.18.

Двоичное x Десятичное x
Двоичное x-1 Десятичное x-1

Рис. 1.18Двоичные и десятичные представления чисел

Легко видеть, что для таких х операция AND для х и х-1 дает в результате 0:

AND
 
Теперь напишем фрагмент программы, который определяет, является ли число x степенью 2.

.........

x dd ?

........

mov eax,x

dec eax

mov ebx,x

and ebx,eax

jz Power_of_Two

..............

Power_of_Two:

...............

2) Выровнять адрес (число) на границу, кратную 2m, с округлением к младшим адресам.

Предлагается следующее преобразование:

x  x AND NOT (2m -1)

Действительно, число 2m –1 в двоичном представлении — это m единиц (см. предыдущее задание).

Значит, NOT (2m –1) — это m нулей в младших разрядах, а в остальных (старших) разрядах — единицы.

Далее, если мы производим операцию AND для х с числом, у которого в младших разрядах m нулей, а в старших — 1, то это значит, что мы обнуляем младшие m разрядов. А это и есть выравнивание на границу, кратную 2^m.

Например,

x=1010111011110011 — двоичное число.

Пусть необходимо выровнять это число на границу, кратную 24, то есть до 3его двоичного разряда включительно.

m=4

2m-1 = 24-1 = 0000000000001111

NOT (24-1) = 1111111111110000

Теперь:

AND
 

Напишем такой фрагмент программы для выравнивания адреса, записанного в переменной х длиной в слово, на границу параграфа с округлением к младшим адресам. Вспомним, что длина параграфа равна 16, то есть 24.

.........

x dw ?

........

mov ax,x

and ax,not(16-1)

..................

Получаем в ax число, округленное на границу параграфа с округлением к младшим адресам.

Обратите внимание на команду AND, а в ее операнде — операцию NOT.

3) Выравнивание адреса на границу, кратную 2m, с округлением к старшим адресам.

Предлагается следующее преобразование:

x  (x +(2m-1) AND NOT (2m-1))

Это аналогично предыдущему, только предварительно к х прибавляется число с единицами в младших m разрядах, чтобы увеличить m+1-ый разряд на 1.

Соответствующий фрагмент программы для выравнивания на границу параграфа с округлением к старшим адресам выглядит следующим образом:

........

x dw ?

........

mov ax,x

add ax,(16-1)

and ax,not(16-1)

................

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

При сдвиге биты операнда передвигаются влево или вправо в зависимости от команды.

Существуют три типа команд сдвига:

q Логический сдвиг — все биты операнда равноправны, выдвигаемые за пределы операнда биты пропадают, а последний заносится во флаг CF.

q Арифметический сдвиг — аналогичен логическому, но знаковый бит имеет особый статус.

q Циклический сдвиг — все биты равноправны, выдвигаемые из операнда биты не теряются, а вдвигаются с другой стороны.

1) SHL операнд, значение — логический сдвиг операнда влево (рис.1.19)

Примеры

1)mov al,01010100b

shl al,1 ; результат — 10101000b, в CF выдвинулся 0

; и справа в результате добавился 0

2)mov cl,3

mov al,01010100b

shr al,cl ; результат -00001010b, в CF выдвинулась 1

; и слева добавилось три 0

3).386

shr al,3; в регистре al все биты сдвигаются на 3

; разряда

Команды сдвига позволяют производить быстрое умножение (сдвиг влево) или деление (сдвиг вправо) на числа, являющиеся степенями 2. В первом примере произошло умножение на 2, во втором примере — деление на 8.

Чтобы это «почувствовать», представим себе, что наш компьютер не «двоичный», а «десятичный» (рис.1.20). В этом случае при умножении на 10 мы добавляем справа 0, что эквивалентно сдвигу числа на 1 позицию влево (5*10=50):

 
  OR – Logical inclusive OR – логическое включающее ИЛИ. - student2.ru

Рис. 1.20 Умножение на 10 с помощью сдвига

При делении удаляется справа 0, то есть происходит сдвиг числа вправо (500/10=050).

Это верно, если интерпретировать операнды как числа без знака. Для того чтобы можно было корректно работать с командами сдвига для чисел со знаком используют команды арифметического сдвига.

3) SAL операнд, значение — арифметический сдвиг влево (аналогично SHL)

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

Пример

MOV AL,11010100B

MOV CL,3

SAR AL,CL ; результат -11111010

MOV AL,11010100b

SHR AL,CL ; результат — 00011010 — ЗНАК ЧИСЛА ПОТЕРЯЛСЯ!

Таким образом, можно производить умножение и деление с помощью сдвига, если один из сомножителей или делитель представляет собой степень 2. Причем, сдвиг производится процессором намного быстрее, чем умножение и деление:

MUL (8-битный регистр) — 70— 77 тактов

(16-битный) —118—133 тактов

IMUL (8-битный регистр) — 80— 98 тактов

(16-битный) —128—154 тактов

IDIV (8-битный регистр) —101—112 тактов

(16-битный) —165—184 тактов

сдвиг регистра на 1 позицию — 2 такта

Даже если мы работаем с числами, не являющимися степенями 2, оказывается, если мы хотим добиться максимальной скорости, можно представить множитель или делитель как сумму степеней 2.

ПРИМЕР задания

Написать фрагменты программы для умножения X*12 двумя способами: с помощью команды умножения и с помощью сдвига. Оценить время выполнения каждого фрагмента.

X*12 = X * (23 + 22) = X * 23 + X * 22

Чтобы умножить число X на 12, нужно произвести сдвиг X влево на 3 бита, и результат где-то запомнить, затем произвести сдвиг X влево на 1 бит. Потом оба результата сложить.

x db 30 x db 30

.......... ..........

mov al,x mov al,x

cbw

mov cl,2 cbw

sal ax,cl ; ax=ax*4 mov bx,10; 2 такта

mov bx,ax imul bx; 128 тактов

OR – Logical inclusive OR – логическое включающее ИЛИ. - student2.ru sal ax,1 ; ax=ax*2

add bx,axвсего 134 такта

 
  OR – Logical inclusive OR – логическое включающее ИЛИ. - student2.ru

cbw, sal, mov — 2 такта

add — 3 такта

 
  OR – Logical inclusive OR – логическое включающее ИЛИ. - student2.ru

всего 15 тактов

Таким образом, хоть первая программа и длинней, она будет выполняться намного быстрее (за 15 тактов), а вторая — за 134 такта. Отметим, что здесь не учитывается время для выборки переменной из сегмента данных.

5) ROL операнд, значение — сдвиг влево циклический (ROll Left) (рис.1.22)

Примеры

mov al,11010101b

rol al,1; результат 10101011, в CF — 1, и она же — в 0 бит

mov al,11010101b; CF=0

rcr al,1; результат 01101010, из CF в 7 бит — 0, в CF — 1

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

Пример

FFFE 000C
EAX

Младшая часть регистра EAX имеет название — AX, а старшая — нет. Команда ROL позволяет получить доступ к старшей части 32х-разрядного регистра:

ROL EAX,16 ; младшая и старшая часть регистра поменяются местами

Теперь:

 
 
000C FFFE

EAX

AX

и бывшая старшая часть доступна в AX.

ПРИМЕР задания

Поделить число, находящееся в паре регистров DX, AX, на 4.

Чтобы это осуществить, нужно синхронно сдвигать оба регистра вправо так, чтобы биты из DX попадали при сдвиге в AX. Один из способов состоит в следующем:

1) сдвигаем DX на 1 разряд вправо (при этом бит из DX попадает во флаг CF);

2) осуществляем циклический сдвиг вправо через перенос регистра AX, при этом бит из CF (он туда попал из DX) попадает в старший разряд регистра AX.

Пункты 1) и 2) повторяем 2 раза, так как 4=22.

..........

shr dx,1

rcr ax,1

shr dx,1

rcr ax,1

..........

Контрольные вопросы

1. Что такое маска?

2. Приведите примеры ситуаций, в которых необходимо использование логических команд.

3. Команда OR, как создать маску, принцип использования?

4. Команда AND, как создать маску, принцип использования?

5. Команда XOR, как создать маску, принцип использования?

6. В чем разница между командами NOT и NEG?

7. В каких ситуациях используют команду сравнения? Принцип ее работы.

8. В чем отличие между командами TEST и AND?

9. Какие флаги используются при сравнении чисел без знака?

10. Какие флаги используются при сравнении чисел со знаком?

11. Как использовать команду OR для проверки знака числа или равенства 0 числа?

12. Назовите и объясните принципы работы команд сдвигов (арифметических, логических, циклических).

ПРАКТИЧЕСКИЕ ЗАДАНИЯ

Задание 1 (по вариантам).

1. В регистре DL установить 6-й, 3-й и 1-й биты и сбросить 0 бит.

2. Инвертировать 4-й и 3-й биты регистра BH, а знаковый бит установить в 1.

3. Умножить операнд в DL на 20.

4. Поместить в старший байт регистра SI младший байт регистра DI.

5. Двойное слово в DX:AX умножить на 4.

6. Сосчитать количество единичных битов в AX. Результат поместить в BX.

7. Разделить содержимое регистра CX на 32.

8. Поместить в регистр CL старший байт регистра DI.

9. Заменить 0,6,7 и 9 биты регистра BХ на 0,6,7 и 8 биты регистра DХ (соответственно).

10. Расположить содержимое AX в регистре BX в обратном порядке.

11. Инвертировать 3-й и 0-й биты регистра CH и сбросить 5 и 7 биты.

12. Переписать три младших бита регистра ВХ на место 10,11 и 12 битов.

13. Двойное слово в DX:AX разделить на 8.

14. В регистре AL установить 1-й, 5-й и 6-й биты, а 4 бит инвертировать.

15. Получить дополнительный код числа в регистре DI, не используя команды NOT или NEG.

16. Заменить три старших бита регистра SI на три младших бита регистра AX.

17. Умножить операнд в DH на 19.

18. Инвертировать четные биты регистра DX, а нечетные обнулить.

19. Заменить 3,4 и 5 биты регистра BL на 3,4 и 5 биты регистра СХ.

20. Разделить содержимое AX на 64.

21. Переписать четыре старших бита регистра СХ на место 3,4,5 и 6 битов.

22. Умножить содержимое регистра BX на 14.

23. Инвертировать нечетные биты регистра AX, а четные установить в 1.

24. Сосчитать количество нулевых битов в CX. Результат поместить в DX.

25. Поменять местами содержимое регистров AL и AH.

26. Поместить в младший байт регистра SI младший байт регистра AX

27. Умножить содержимое регистра BX на 11.

28. В регистре CX в четные биты записать 1, а в нечетные 0.

29. Заменить 1,4 и 7 биты регистра DH на 7,4 и 5 биты регистра СL (соответственно).

Задание 2

Записать машинные коды логических команд и команд сдвигов, используемых в программе из Задания 1. Самостоятельно выполнить действия по этим командам и установить флаги.

Пример выполнения:

Записать машинные коды команд, их 16-ричное представление, выполнить действия и установить флаги.

AND [SI], CH ; допустим ( [SI] ) ® 59h, (CH) ® 3Dh

Машинный код команды: 00100000 00101100 ; команда занимает 2 байта

16-ричный код команды: 202Ch.

Выполним логическую команду AND над операндами OR – Logical inclusive OR – логическое включающее ИЛИ. - student2.ru

Ответ: 19h.

Установим флаги, на которые влияет операция AND:

  1. CF=0 (всегда);
  2. PF = 0, т.к. кол-во 1 в байте результата = 3, а это число нечетное;
  3. AF не определен;
  4. ZF = 0, т.к. результат операции не равен нулю;
  5. SF = 0, т.к. знаковый бит содержит 0;
  6. OF = 0 (всегда).

Ход работы.

  1. Познакомиться с необходимой теоретической информацией.
  2. Ответить на контрольные вопросы.
  3. Выполнить предложенные задания на программирование.
  4. Оформить отчет.
  5. Защитить работу.

Минимально адресуемая единица данных в микропроцессоре – байт. Логические команды позволяют манипулировать отдельными битами. Это единственные команды в системе команд микропроцессора, которые позволяют работать на битовом уровне. Этим, в частности, объясняется их важность. Булевы (логические) команды основаны на операциях булевой алгебры. Эти операции разрешают модификацию отдельных бит в двоичных числах, как показано в таблице:

Операция Описание
AND Результат равен 1, только если оба бита равны 1.
OR Результат равен 1, когда хотя бы один бит равен 1.
XOR Результат равен 1, только когда оба бита разные (исключающее ИЛИ)
NOT Результатом является противоположное значение (1 становится 0, а 0 становится 1)
NEG Получает двоичное дополнение числа.
TEST Выполняется команда AND без записи результат, устанавливаются только флаги.
CMP Сравниваются два операнда, устанавливаются соответствующие флаги.

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

1. Для установки определенных разрядов (бит) применяется команда

OR – Logical inclusive OR – логическое включающее ИЛИ.

OR приемник, маска

Действие: приемник = приемник OR маска.

Команда выполняет операцию логического ИЛИ над соответствующими парами бит операндов приемник и маска.0

Флаги: CF=0, OF=0, PF, AF не определен, ZF, SF.

16-ричный код (1 байт) MOD Reg/OPC Reg/Mem (2-ой байт) смещение disp_Lo, disp_Hi формат операндов: приемник, источник
MOD Reg/OPC Reg/Mem Disp_Lo, Disp_Hi Reg8/Mem8, Reg8
MOD Reg/OPC Reg/Mem Disp_Lo, Disp_Hi Reg16/Mem16, Reg16
0A MOD Reg/OPC Reg/Mem Disp_Lo, Disp_Hi Reg8, Reg8/Mem8
0B MOD Reg/OPC Reg/Mem Disp_Lo, Disp_Hi Reg16, Reg16/Mem16
0C Data8 (непосредств.операнд) отсутствует AL, Immed8
0D Data16 (непосред.операнд) отсутствует AX, Immed16
  MOD 001 Reg/Mem Disp_Lo, Disp_Hi Data Lo Reg8/Mem8, Immed8
  MOD 001 Reg/Mem Disp_Lo, Disp_Hi Data Lo, Data Hi Reg16/Mem16, Imm16
  MOD 001 Reg/Mem Disp_Lo, Disp_Hi Data SX Reg16/Mem16, Imm8

001 - расширение кода операции при работе с непосредственным операндом, размещается в поле Reg/Opc в байте адресации.

Примеры команд:

1. Мнемоническая запись: OR [BP+DI], AH ; формат операндов Mem8, Reg8

Машинный код команды: 00001000 00100011 ; команда занимает 2 байта

16-ричный код команды: 0823h.

2. Мнемоническая запись: OR DH, DH ; формат операндов Reg8, Reg8

Машинный код команды: 0000100011110110 ; команда занимает 2 байта

16-ричный код команды: 08F6h.

3. Мнемоническая запись: OR BX, [SI+12] ;формат операндов Reg16, Mem16

Машинный код команды: 000010110101110000001100 ;команда занимает 3 байта

16-ричный код команды: 0B5C0Ch.

4. Мнемоническая запись: OR AL, -1 ; формат операндов Reg8, imm8

Машинный код команды: 0000110011111111 ; команда занимает 2 байта

16-ричный код команды: 0CFFh.

2. С помощью команды AND можно очищать отдельные биты в операнде-приемнике, при этом защищая (маскируя) оставшиеся биты.

Наши рекомендации