Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Битовые операции. Команды 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

TEST BH, 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 разрядов.

 

 

Рассмотрим примеры логического сдвига:

 

MOV AL, 01000111b

SHL AL, 1; CF=0 AL=10001110b

MOV AL, 01000111b

SHR AL, 1; CF=1 AL=00100011b

 

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

 

; op=op*2k (op - число со знаком и без)

MOV CL, k

SHL op, CL

 

Сдвиг на k разрядов вправо есть отбрасывание последних k разрядов, что соответствует получению неполного частного (операции div) от деления на 2k:

 

; ор=ор div 2k (op - число без знака)

MOV CL, k

SHR op, CL

 

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

Например, для умножения регистра AX на 10 можно выполнить следующие команды:

 

MOV BX, AX; сохранить в BX содержимое регистра AX

SHL AX, 1; умножить AX на 2

SHL AX, 1; умножить AX на 4

ADD AX, BX; умножить AX на 5

SHL AX, 1; умножить AX на 10

 

В следующем примере команда SHL используется для преобразования двух неупакованных двоично-десятичных чисел (старшая цифра находится в регистре BL, младшая – в регистре AL) в упакованное число в регистре AL:

 

MOV CL, 4; загрузить счетчик сдвига

SHL BL, CL; сдвинуть старшую цифру влево на 4 бита

OR AL, BL; объединить старшую и младшую цифры

 

Впоследствии команды простого сдвига дополнились еще двумя командами SHRD и SHLD. Они обеспечивают выполнение операций сдвига двойной точности. Команды имеют три операнда. Назначение первого операнда (приемника) и третьего операнда прежнее, а второй операнд (источник) должен быть только регистром и хранит старшую половину сдвигаемого числа. При выполнении сдвига по команде SHRD операнд-приемник дополняется разрядами операнда-приемника, начиная с самого старшего разряда, а по команде SHLD – начиная с самого младшего разряда.

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

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

 

Табл. 41. Команда SAL.

Код Инструкция Описание
D0 /4 SAL r/m8, 1 Арифметический сдвиг r/m8 влево на 1 разряд.
D2 /4 SAL r/m8, CL Арифметический сдвиг r/m8 влево на CL разрядов.
D1 /4 SAL r/m16, 1 Арифметический сдвиг r/m16 влево на 1 разряд.
D3 /4 SAL r/m16, CL Арифметический сдвиг r/m16 влево на CL разрядов.

 

 

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

 

 

Табл. 42. Команда SAR.

Код Инструкция Описание
D0 /7 SAR r/m8, 1 Арифметический сдвиг r/m8 вправо на 1 разряд.
D2 /7 SAR r/m8, CL Арифметический сдвиг r/m8 вправо на CL разрядов.
D1 /7 SAR r/m16, 1 Арифметический сдвиг r/m16 вправо на 1 разряд.
D3 /7 SAR r/m16, CL Арифметический сдвиг r/m16 вправо на CL разрядов.

 

 

Рассмотрим примеры арифметического сдвига:

 

MOV BH, 10001110b

SAR BH, 1; CF=0 ВН=11000111b

MOV BH, 00001110b

SAR BH, 1; CF=0 ВН=00000111b

 

 

Команда SAR может быть использована для быстрого получения неполного частного при делении знаковых чисел на степени 2. Однако она отличается от команды IDIV. Команда IDIV округляет частное в сторону 0, а SAR – в сторону минус бесконечности. Например, при делении -1 на 2 (при частном -0.5) команда IDIV выдаст ответ 0, а команда SAR -1. При делении неотрицательных чисел на степени 2, команда SAR даст тот же ответ, что и команды SHR, DIV и IDIV.

Циклические сдвиги. Особенность циклических сдвигов состоит в том, что «уходящий» бит не пропадает, а возвращается в операнд с другого конца.

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

 

Табл. 43. Команда ROL.

Код Инструкция Описание
D0 /0 ROL r/m8, 1 Циклический сдвиг r/m8 влево на 1 разряд через CF.
D2 /0 ROL r/m8, CL Циклический сдвиг r/m8 влево на CL разрядов через CF.
D1 /0 ROL r/m16, 1 Циклический сдвиг r/m16 влево на 1 разряд через CF.
D3 /0 ROL r/m16, CL Циклический сдвиг r/m16 влево на CL разрядов через CF.

 

 

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

 

Табл. 44. Команда ROR.

Код Инструкция Описание
D0 /1 ROR r/m8, 1 Циклический сдвиг r/m8 вправо на 1 разряд через CF.
D2 /1 ROR r/m8, CL Циклический сдвиг r/m8 вправо на CL разрядов через CF.
D1 /1 ROR r/m16, 1 Циклический сдвиг r/m16 вправо на 1 разряд через CF.
D3 /1 ROR r/m16, CL Циклический сдвиг r/m16 вправо на CL разрядов через CF.

 

 

Приведем примеры применения двух последних команд:

 

MOV CL, 11000011b

ROL CL, 1; CF=1, CL=10000111b

MOV BH, 11100010b

ROR BH, 1; BH=01110001b, CF=0

 

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

 

MOV AL, 17h; AL=00010111b

MOV CL, 4

ROL AL, CL; AL=01110001b=71h

 

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

 

 

Табл. 45. Команда RCL.

Код Инструкция Описание
D0 /2 RCL r/m8, 1 Циклический сдвиг r/m8 влево на 1 разряд через CF.
D2 /2 RCL r/m8, CL Циклический сдвиг r/m8 влево на CL разрядов через CF.
D1 /2 RCL r/m16, 1 Циклический сдвиг r/m16 влево на 1 разряд через CF.
D3 /2 RCL r/m16, CL Циклический сдвиг r/m16 влево на CL разрядов через CF.

 

 

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

 

 

Табл. 46. Команда RCR.

Код Инструкция Описание
D0 /3 RCR r/m8, 1 Циклический сдвиг r/m8 вправо на 1 разряд через CF.
D2 /3 RCR r/m8, CL Циклический сдвиг r/m8 вправо на CL разрядов через CF.
D1 /3 RCR r/m16, 1 Циклический сдвиг r/m16 вправо на 1 разряд через CF.
D3 /3 RCR r/m16, CL Циклический сдвиг r/m16 вправо на CL разрядов через CF.

 

 

Пример команды циклического сдвига:

 

MOV BL, 11110000b; пусть CF=0

RCL BL, 1; CF=1, BL=11100000b

RCL BL, 1; CF=1, BL=11000001b




Поделиться с друзьями:


Дата добавления: 2014-11-16; Просмотров: 1107; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.108 сек.