Флаги: of, sf, zf, af, pf, cf
16-ричный код (1 байт) | MOD Reg/OPC Reg/Mem (2-ой байт) | смещение disp_Lo, disp_Hi | формат операндов: приемник, источник |
F6 | MOD 010 Reg/Mem | Disp_Lo, Disp_Hi | Reg8/Mem8 |
F7 | MOD 010 Reg/Mem | Disp_Lo, Disp_Hi | Reg16/Mem16 |
010 - расширение кода операции при работе с непосредственным операндом, размещается в поле Reg/Opc в байте адресации.
Например, MOV AX, 0FFFFh
NOT AX ; AX=0000h
MOV DI, 5551h
NOT DI ; DI=AAAEh
Например, дополнение до 1 числа F0h будет равняться 0Fh
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)