Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭВМ практические.docx
Скачиваний:
101
Добавлен:
11.04.2015
Размер:
275.2 Кб
Скачать

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

Логическим командам, которые, как следует из их названия, выполняют логические операции - отрицание, конъюнкцию и дизъюнкцию, присущ ряд общих черт.

Во-первых, все они реализуют, как говорят, поразрядные операции. Это озна-чает, что i-й разряд результата зависит только от i-ых разрядов операндов и ни от чего иного. При этом одна и та же операция выполняется сразу над всеми разрядами операндов одновременно, параллельно.

Во-вторых, во всех этих командах бит 1 трактуется как "истина", а бит 0 - как "ложь". Именно при такой трактовке эти команды и реализуют логические операции отрицания, конъюнкции и дизъюнкции.

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

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

Отрицание:NOT ор

Допустимые типы операнда: r8, m8, r1б, m16. Эта команда меняет значение каждого бита операнда на противоположное: 0 на 1 и 1 на 0; результат записывается на место операнда. Например:

MOV AL,1100b ;AL=00001100b

NOT AL ;AL=11110011b

Конъюнкция (логическое умножение): AND op1,op2

В этой команде допустимы следующие комбинации операндов:

ор1 ор2

r8 i8, r8, m8

m8 i8,r8

r16 il6, rl6, ml6

m16 il6, rl6

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

MOV AL,1100b ;AL=00001100b

AND AL,1010b ;AL=00001000b

X

Y

x and y

x xor y

x or y

1

1

1

1

0

1

0

0

1

1

0

1

0

1

1

0

0

0

0

0

Проверка: TEST opl,op2

Это аналог команды AND, но результат логического умножения никуда не записывается. Главное в команде TEST - установка флагов. Как уже было сказано, в логических командах интерес представляет только флаг нуля ZF. Так вот, он равен 1, если в результате логического умножения получился нулевой ответ, и равен 0, если в ответе есть хотя бы одна двоичная 1.

Примеры:

MOV BH,1100b

TEST BH,0011b ;= 00000000b -> ZF=1

TEST BH,1010b ;= 00001000b -> ZF=0

Команда TEST обычно применяется для проверки, являются ли нулевыми какие-то разряды операнда. Например, сделать переход на метку L в случае, если правые три бита регистра АХ нулевые, можно так:

TEST AX,111b

JZ L

Дизъюнкция (логическое сложение): OR op1,op2

Допустимые типы операндов - как в команде AND.

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

MOV CL,1100b

OR CL,1010b ;CL=00001110b

Исключающее ИЛИ (exclusive OR): XOR opl,op2

Допустимые типы операндов - как в команде AND.

И здесь результат записывается на место первого операнда, причем i-й бит результата равен 0, если i-e биты операндов совпадают, и равен 1, если эти биты различны (см. таблицу). Например:

MOV CL,1100b

XOR CL,1010b ;CL=00000110b

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

Отметим одну особенность операции XOR: когда операнды команды XOR совпадают, результатом будет нулевое слово. Например, при любом значении АХ имеем:

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

Этот прием часто используется для обнуления регистров; по сравнению с дру-гими приемами (MOV АХ,0 или SUB AX,AX) он выполняется быстрее.

Задание:

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

2a+a*b-b/a, где a=2Dh, b=4Eh

Порядок выполнения работы:

  1. Составить блок-схему алгоритма

  2. Написать программу на языке Ассемблера

  3. Отладить программу TurboDebuger

  4. Заполнить таблицу с ошибками:

Допущенная ошибка

Сообщение об ошибке


Контрольные вопросы:

  1. Какие команды позволяют манипулировать отдельными битами?

  2. Состояние каких флагов нужно контролировать программисту во время вычислительного процесса?

  3. С помощью каких команд возможно проверить значение отдельного бита в операнде. Приведите пример.