Материал: Системное программирование

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

5.4. Логические команды

Битовые операции.Команды AND, OR, XOR и TEST являются командами логических операций. Все они обрабатывают байт или слово, расположенное в регистре или в памяти, и устанавливают флаги CF, OF, PF, SF, ZF.

Логические команды обладают рядом особенностей:

  • Команды реализуют поразрядные операции: i-й разряд результата зависит только от i-х разрядов операндов и операция выполняется одновременно над всеми разрядами операндов.

  • Разряд 1 трактуется как «истина», разряд 0 – как «ложь». Для представления логического нуля и единице используют следующий код: «ложь» – 00000000b (00h) «истина» – 11111111b (0FFh = -1).

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

  • Операндами логических команд должны быть байты, либо слова, но не то и другое одновременно.

Команда NOT выполняет инверсию операнда (табл. 34). Флаги не изменяются.

Табл. 34. Команда NOT.

Код

Инструкция

Описание

F6 /2

NOT r/m8

r/m8:= NOT r/m8

F7 /2

NOT r/m16

r/m16:= NOT r/m16

Результат сохраняется на место первого операнда:

MOV AL, 1010b ; AL=00001010b

NOT AL ; AL=11110101b

Команда ANDвыполняет операцию «логическое И» между операндами (табл. 35). Флаги OF и CF сбрасываются. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Состояние флага AF не определено.

Табл. 35. Команда AND.

Код

Инструкция

Описание

20 /r

AND r/m8, r8

r/m8:= r/m8 AND r8

21 /r

AND r/m16, r16

r/m16:= r/m16 AND r16

22 /r

AND r8, r/m8

r8:= r8 AND r/m8

23 /r

AND r16, r/m16

r16:= r16 AND r/m16

24 ib

AND AL, imm8

AL:= AL AND imm8

25 iw

AND AX, imm16

AX:= AX AND imm16

80 /4 ib

AND r/m8, imm8

r/m8:= r/m8 AND imm8

81 /4 iw

AND r/m16, imm16

r/m16:= r/m16 AND imm16

Команда выполняет поразрядное логическое умножение операндов и записывает результат на место первого операнда: i-й бит результата равен 1, только если i-е биты обоих операндов равны 1, и равен 0, если хотя бы в одном операнде 1-й нулевой, например:

MOV AL, 1100b ; AL=00001100b

AND AL, 1010b ; AL=00001000b

Команда AND часто используется для маскирования отдельных разрядов двоичного числа. Например, чтобы определить значение самого старшего разряда в полученном байте данных можно поступить так:

AND AL, 10000000b

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

Команда TEST выполняет логическое сравнение двух операндов (табл. 36). Флаги OF и CF сбрасываются. Флаги SF, ZF и PF устанавливаются в соответствии с полученным результатом. Состояние флага AF не определено.

Табл. 36. Команда TEST.

Код

Инструкция

Описание

84 /r

TEST r/m8, r8

r/m8 AND r8

85 /r

TEST r/m16, r16

r/m16 AND r16

A8 ib

TEST AL, imm8

AL AND imm8

A9 iw

TEST AX, imm16

AX AND imm16

F6 /0 ib

TEST r/m8, imm8

r/m8 AND imm8

F7 /0 iw

TEST r/m16, imm16

r/m16 AND imm16

Сравнение выполняется с помощью операции «логическое И» между разрядами первого и второго операндов. Результат операции теряется, но производится установка флагов:

MOVВН, 1100b

TESTBH, 0011b;ZF=1

Команда ORвыполняет операцию «логическое ИЛИ» между операндами (табл. 37). Флаги OF и CF сбрасываются. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Состояние флага AF не определено.

Табл. 37. Команда OR.

Код

Инструкция

Описание

08 /r

OR r/m8, r8

r/m8:= r/m8 OR r8

09 /r

OR r/m16, r16

r/m16:= r/m16 OR r16

0A /r

OR r8, r/m8

r8:= r8 OR r/m8

0B /r

OR r16, r/m16

r16:= r16 OR r/m16

0C ib

OR AL, imm8

AL:= AL OR imm8

0D iw

OR AX, imm16

AX:= AX OR imm16

80 /1 ib

OR r/m8, imm8

r/m8:= r/m8 OR imm8

81 /1 iw

OR r/m16, imm16

r/m16:= r/m16 OR imm16

Результат записывается на место первого операнда: i-й бит результата равен 0, если i-е биты операндов совпадают, и равен 1, если эти биты различны, например:

MOV CL, 1100b

OR CL, 1010b ; CL=00001110b

Команда OR часто используется при наложении маски. Например, в полученном байте данных необходимо установить младшие три разряда в 1. Тогда маска будет следующей:

OR AL, 00000111b

Команда XORвыполняет операцию «исключающее ИЛИ» между операндами (табл. 38). Флаги OF и CF очищаются. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Состояние флага AF не определено.

Табл. 38. Команда XOR.

Код

Инструкция

Описание

30 /r

XOR r/m8, r8

r/m8:= r/m8 XOR r8

31 /r

XOR r/m16, r16

r/m16:= r/m16 XOR r16

32 /r

XOR r8, r/m8

r8:= r8 XOR r/m8

33 /r

XOR r16, r/m16

r16:= r16 XOR r/m16

34 ib

XOR AL, imm8

AL:= AL XOR imm8

35 iw

XOR AX, imm16

AX:= AX XOR imm16

80 /6 ib

XOR r/m8, imm8

r/m8:= r/m8 XOR imm8

81 /6 iw

XOR r/m16, imm16

r/m16:= r/m16 XOR imm16

Результат заносится на место первого операнда:

MOV CL, 1100b

XOR CL, 1010b ; CL=00000110b

Когда операнды команды XOR совпадают, результатом будет нулевое слово. Такой прием часто используется для обнуления регистров. По сравнению с другими вариантами (MOV АХ, 0 или SUB AX, AX) он выполняется быстрее. Например, при любом значении АХ имеем:

XOR АХ, АХ ; АХ:=0

Вычисление логических выражений.Очевидное применение логических команд состоит в вычислении логических выражений. Например, если переменные:

A DB ?

B DB ?

трактуются как логические, то вычисление:

A:=(not A) and B

реализуется с помощью следующих команд:

MOV AL, А

NOT AL

AND AL, B

MOV A, AL

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

Например, условный оператор:

if (X > 0) or (Y = 1) then goto L

можно сначала полностью вычислить логическое выражение, а затем проверить результат.

Можно поступить и проще: сравнивать X с нулем и Y с единицей, и с помощью команд условного перехода реагировать на проверки (см. раздел 5.5.5):

CMPХ, 0 ; сравнениеXс нулем

JG L ; Х > 0

JE L ; Y = 1

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

  • обрабатывают байт или слово;

  • имеют доступ к регистру или к памяти;

  • сдвигают операнд на величину до 8 бит (для байта) и 16 бит (для слова) влево или вправо;

  • сдвигают логически (без знака) или арифметически (со знаком).

Все команды сдвига имеют два операнда. Первый операнд рассматривается как набор битов, которые будут сдвигаться на несколько позиций влево или вправо. Второй операнд (целое без знака) определяет, на сколько разрядов следует сдвинуть первый операнд. Результат записывается на место первого операнда. Значение сдвига на 1 разряд может быть записано как непосредственный операнд, а значение, большее 1, должно находиться в регистре CL.

Каждая команда сдвига имеет две разновидности, которые записываются следующим образом:

<мнемокод> ор, 1 ; сдвиг ор на 1 разряд

<мнемокод> op, CL ; сдвиг ор на CL разрядов (CL 0)

В первом случае операнд ор сдвигается на 1 разряд, во втором ор может сдвигаться на любое число разрядов. Заметим, что второй вариант есть повторение первого CL раз, причем при CL=0 сдвига нет. Значение CL командой сдвига не меняется. Команды сдвига меняют все флаги, но, как правило, интерес представляет только флаг переноса CF.

Сдвиг может быть выполнен на произвольное число разрядов от 0 до 255. В процессорах, начиная с 80286, в качестве счётчика сдвига используются только младшие 5 разрядов регистра CL, что ограничивает максимальное количество сдвигов (не более 31).

Начиная с процессора 80186, стало доступно возможность явного задания величины сдвига, больше 1. Вторым операндом в этом случае является беззнаковое число размером байт. Процессоры 80386 и выше в качестве величины сдвига берут 3 правых бита регистра CL при сдвиге байта и 4 правых байта при сдвиге слова.

Все команды сдвига можно разделить на команды логического сдвига(простого сдвига),арифметическогоициклического.

Логические сдвиги.В командах логического сдвига участвуют все биты первого операнда. При этом бит, уходящий за пределы ячейки, заносится во флаг CF, а с другого конца в операнд добавляется 0.

Команда SHLпроизводит логический сдвиг содержимого операнда влево на указанное вторым операндом число разрядов (табл. 39). Флаг CF содержит значение последнего выдвинутого из операнда разряда. Значение флага OF в операции многоразрядного сдвига не определено. В операции одноразрядного сдвига он представляет результат операции «исключающее ИЛИ» между значением старшего разряда результата и содержимым флага CF после выполнения сдвига.

Таким образом, единичное значение флага OF свидетельствует о том, что содержимое старшего разряда результата отличается от его исходного значения, а нулевое значение – что старший разряд операнда не изменился. Флаги SF, ZF и PF устанавливаются в соответствии с полученным результатом. Значение флага AF не определено.

Табл. 39. Команда SHL.

Код

Инструкция

Описание

D0 /4

SHL r/m8, 1

Логический сдвиг r/m8 влево на 1 разряд.

D2 /4

SHL r/m8, CL

Логический сдвиг r/m8 влево на CL разрядов.

D1 /4

SHL r/m16, 1

Логический сдвиг r/m16 влево на 1 разряд.

D3 /4

SHL r/m16, CL

Логический сдвиг r/m16 влево на CL разрядов.

Команда SHRпроизводит логический сдвиг содержимого операнда вправо на указанное вторым операндом число разрядов (табл. 40). Флаг CF содержит значение последнего выдвинутого из операнда разряда. Флаг CF содержит значение последнего выдвинутого из операнда разряда.

Значение флага OF в операции многоразрядного сдвига не определено. В операции одноразрядного сдвига устанавливается, если перед выполнением сдвига старший разряд операнда содержал единицу, и сбрасывается в противном случае. Поскольку после выполнения сдвига старший разряд будет содержать нуль, флаг OF показывает, произошла ли смена значения старшего разряда операнда. Флаги SF, ZF, AF и PF не изменяются.

Табл. 40. Команда SHR.

Код

Инструкция

Описание

D0 /5

SHR r/m8, 1

Логический сдвиг r/m8 вправо на 1 разряд.

D2 /5

SHR r/m8, CL

Логический сдвиг r/m8 вправо на CL разрядов.

D1 /5

SHR r/m16, 1

Логический сдвиг r/m16 вправо на 1 разряд.

D3 /5

SHR r/m16, CL

Логический сдвиг r/m16 вправо на CL разрядов.

Источник: https://files.student-it.ru/previewfile/284711