Флаги: 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

  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

флаги: of, sf, zf, af, pf, cf - student2.ru

флаги: of, sf, zf, af, pf, cf - 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)



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