Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Булатов В.Н. Архитектура микропроцессороной системы, состав машинных команд и основы программирования микропроцессорной .pdf
Скачиваний:
97
Добавлен:
02.05.2014
Размер:
7.1 Mб
Скачать

+0001

Bдоп=1000 —дополнительный код B.

Складываем: A+Bдоп:

0101

+1000

0 1101

Перенос=0

Переполнения нет, но флажок CF=1, так как он устанавливается переполнением через инвертор.

А теперь подставим значение CF=1 в качестве старшего бита уменьшаемого и вычтем вычитаемое B:

<CF>

1 0101

1000

1101

Получили тот же результат, что и выше. Вывод: при вычитании флаг CF имеет смысл заема! Но заем предполагает наличие старшей части числа. А если ее нет? Тогда необходимо вспомнить, что все числа

вАЛУ представлены в дополнительном коде, и если после вычитания CF=1 , а занимать не у «кого», то полученный результат есть отрицательное число в дополнительном коде. Чтобы получить результат

вистинном виде, необходимо полученное отрицательное число (беззнаковое) перевести в прямой код:

CF=1 1101

инверсия

CF=1 0010

+0001 — инкремент, чтобы «не трогать» <CF> CF=1 0011

Получили: 510 —810 = -310, где <CF> имеет смысл знака.

Ассемблер команды вычитания (пример):

SUB AX,BX ; AX:=<AX>-<BX>; заем (если есть) — в CF.

6.4 Команда вычитания с учетом заема

Эта команда вычитания как раз и учитывает возможный заем от предыдущего вычитания. Рассмотрим следующий пример.

Пример 2 — Пусть в ячейках памяти M1001 и M1000 находится уменьшаемое, а в DX-вычитаемое. Разность отправить в DX.

Ответ: Составляем программу с демонстрацией использования процедуры заема на ассемблере:

SUB [1000],DL ; M1000:=<M1000>-<DL>, заем (если есть) — в CF, MOV DL,[1000] ; и младшую часть разности отправить в DL.

SBB [1001],DH ; M1001:=<M1001>-<DН>-заем (если он есть),

42

MOV DH,[1000] ; и разность в DH.

6.5 Команда логической функции ИЛИ

Основные логические функции булевой алгебры —это И, ИЛИ, НЕ. В таблице представлены только две из них: И (AND) и ИЛИ (OR). Дело в том, что операция НЕ оперирует только с одним адресатом, поэтому ее здесь нет. Ее рассмотрим в конце этой главы. А пока вернемся к команде ИЛИ (дизъюнкция).

Рассмотрим следующий пример. Пусть в AL=3C (001111002), в AH=41 (010000012). Что получится после выполнения OR AH,AL? Учитывая, что с многобитовыми событиями логические операции выполняются по-битно, можем записать:

00111100 (3С)

(ИЛИ)

(41)

 

01000001

AH =

01111101

 

7 D.

 

Эта логическая

операция

используется достаточно часто.

Например, еобходимо установить бит D5 ячейки памяти M1000 в единицу, оставив неизменными остальные биты M1000. Это делается очень просто. Составим байт, у которого бит D5=1: 001000002=2016. Выполним команду:

OR BYTE [1000],20

И все.

6.6 Команда логической функции И

Операция И (конъюнкция) выполняется аналогично ИЛИ (смотрите п.5 таблицы 5).

Рассмотрим пример. Пусть в регистре АХ хранятся следующие события: AH=42, AL=7C. Что будет в регистре AL после выполнения команды AND AL,AH?

И)

01111100

(7С)

01000010

(42)

 

AL=

01000000

0

4

Эта команда тоже достаточно популярна. Например, она позволяет сбрасывать в «0»один бит в байте (слове), оставляя неизменными другие биты. Пусть, например, необходимо установить бит D5 ячейки памяти M1000 в «0», оставив при этом неизменными остальные биты. Составляем байт, у которого D5=0: 11011112=DF. Выполним команду:

AND BYTE [1000],DF.

Бит D5 ячейки памяти M1000 будет сброшен в «0».

43