OR – Logical inclusive OR – логическое включающее ИЛИ.
Ход работы.
- Познакомиться с необходимой теоретической информацией.
- Ответить на контрольные вопросы.
- Выполнить предложенные задания на программирование.
- Оформить отчет.
- Защитить работу.
Минимально адресуемая единица данных в микропроцессоре – байт. Логические команды позволяют манипулировать отдельными битами. Это единственные команды в системе команд микропроцессора, которые позволяют работать на битовом уровне. Этим, в частности, объясняется их важность. Булевы (логические) команды основаны на операциях булевой алгебры. Эти операции разрешают модификацию отдельных бит в двоичных числах, как показано в таблице:
Операция | Описание |
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)
- Команда NOT операнд
делает инверсию всех битов исходного операнда, изменяя нули на единицы и наоборот. Результат называется дополнением до единицы. Следующие операнды разрешены:
NOT (NOT operand) – инвертирование всех битов операнда приемник.
NOT регистр
NOT память
Mov al, 11110000b
not al ; AL = 00001111b
- Команда 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
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:
|
.........
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):
Рис. 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 тактов
sal ax,1 ; ax=ax*2
add bx,axвсего 134 такта
cbw, sal, mov — 2 такта
add — 3 такта
всего 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
Команды циклического сдвига могут использоваться, когда необходимо, например, менять местами фрагменты битов в операнде.
Пример
|
Младшая часть регистра EAX имеет название — AX, а старшая — нет. Команда ROL позволяет получить доступ к старшей части 32х-разрядного регистра:
ROL EAX,16 ; младшая и старшая часть регистра поменяются местами
Теперь:
|
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 над операндами
Ответ: 19h.
Установим флаги, на которые влияет операция AND:
- CF=0 (всегда);
- PF = 0, т.к. кол-во 1 в байте результата = 3, а это число нечетное;
- AF не определен;
- ZF = 0, т.к. результат операции не равен нулю;
- SF = 0, т.к. знаковый бит содержит 0;
- OF = 0 (всегда).
Ход работы.
- Познакомиться с необходимой теоретической информацией.
- Ответить на контрольные вопросы.
- Выполнить предложенные задания на программирование.
- Оформить отчет.
- Защитить работу.
Минимально адресуемая единица данных в микропроцессоре – байт. Логические команды позволяют манипулировать отдельными битами. Это единственные команды в системе команд микропроцессора, которые позволяют работать на битовом уровне. Этим, в частности, объясняется их важность. Булевы (логические) команды основаны на операциях булевой алгебры. Эти операции разрешают модификацию отдельных бит в двоичных числах, как показано в таблице:
Операция | Описание |
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 можно очищать отдельные биты в операнде-приемнике, при этом защищая (маскируя) оставшиеся биты.