Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР_6-7.doc
Скачиваний:
8
Добавлен:
27.09.2019
Размер:
169.98 Кб
Скачать

3.2. Команды вычитания

Микроконтроллеры семейства МК51 имеют следующие команды вычитания

SUBB A, Rn ; (A)  (A) - (Rn) - (C) - Вычитание из аккумулятора регистра и заема

SUBB A, ad ; (A)  (A) - (ad) - (C) - Вычитание из аккумулятора прямоадресуемого

 байта и заема

SUBB A, @Ri ; (A)  (A) - ((Ri)) - (C) - Вычитание из аккумулятора байта ПД и заема

SUBB A, #d ; (A)  (A) - #d - (C) - Вычитание из аккумулятора константы и заема

3.2.1. При выполнении команд вычитания предполагается, что уменьшаемое находится в аккумуляторе, местонахождение вычитаемого указывается в команде, результат операции (разность) помещается в аккумулятор.

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

При выполнении арифметической операции вычитания используется термин заем. Заем в старший разряд возникает, когда уменьшаемое меньше вычитаемого, при этом разность – число отрицательное.

В МК51 в качестве индикатора заема при вычитании используется флаг переноса C, который устанавливается следующим образом

А) если переноса из старшего (7-го) разряда результата не возникает, то устанавливается флаг C = 1. Это означает, что при вычитании был заем в старший разряд, т.е. уменьшаемое меньше вычитаемого, а в результате будет отрицательное число в дополнительном коде

Б) если возникает перенос из старшего разряда результата, то сбрасывается флаг C = 0. Это означает, что при вычитании заема не было, т.е. уменьшаемое больше вычитаемого, и в результате будет положительное число в дополнительном коде. Но так как для положительного числа его прямой код совпадает с дополнительным, то проще сказать, что при C = 0 в результате будет положительное число.

Обратите внимание на отличие установки флага C в операциях вычитания и сложения (при сложении, если нет переноса, флаг C сбрасывается). Это отличие вызвано использованием дополнительного кода при вычитании.

Рассмотрим пример выполнения операции вычитания.

Пример. Аккумулятор содержит число 05H, регистр R2 – число 06H. Для вычитания используем команду SUBB A, R2. Для ее правильной работы необходимо, чтобы флаг C был сброшен, т.е. C = 0 (отсутствие заема перед выполнением команды). В этом случае команда SUBB A, R2 выполняется следующим образом.

Сначала число 06H (вычитаемое) преобразуется в дополнительный код. Для этого необходимо инвертировать все разряды (получается обратный код) и затем прибавить 1 к младшему разряду полученного кода

06H = 0000 0110 - прямой код,

инвертирование разрядов

1111 1001 - обратный код

+

1

------------------

1111 1010 - дополнительный код.

После этого производится обычное сложения уменьшаемого с дополнительным кодом вычитаемого

0000 0101 = 05H

+

1111 1010 = (- 06H)

-----------------------------------

1111 1111 = FFH

Так как при сложении кодов переноса из старшего (7-го) разряда результата не было, то устанавливается флаг C = 1. Это будет означать, что при вычитании был заем в старший разряд, т.е. уменьшаемое меньше вычитаемого, а в результате будет отрицательное число в дополнительном коде.

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

  1. сначала из дополнительного кода вычитается 1 , а затем инвертируются все разряды полученного числа. Имеем

1111 1111 - дополнительный код

-

1

------------------

1111 1110 - обратный код.

Инвертируем разряды обратного кода, получим 0000 0001 = 01H;

  1. сначала инвертируем разряды дополнительного кода, а затем к полученному числу прибавляем 1. Имеем

1111 1111 - дополнительный код

Инверсия

---------------

0000 0000

+

1

-----------------------

0000 0001 = 01H.

Второй вариант получения прямого кода из дополнительного проще для программирования из-за отсутствия операции вычитания.

Итак, в результате выполнения команды SUBB A, R2 (при C = 0) получилось отрицательное число - 01H, т.е. правильный результат 05H – 06H = - 01H.

3.2.2. Занесите в память симулятора AVSIM51 программу, выполняющую операцию вычитания из аккумулятора непосредственных данных (константы)

CLR C ; Сбросить флаг переноса C

SUBB A, #06H ; Вычитание из аккумулятора числа 06H

NOP

Выполните программу в пошаговом режиме при трех значениях исходных значениях аккумулятора. Результаты занесите в табл. 4.

Таблица 4

Исходные данные

Результат

Аккумулятор

Аккумулятор

Флаг C

Флаг P

05H = 0000 0101

06H = 0000 0110

07H = 0000 0111

Проанализируйте полученные результаты. Как значение флага C после выполнения операции вычитания отражает соотношение уменьшаемого и вычитаемого

3.2.3. Рассмотрим выполнение микроконтроллером вычитания многобайтных чисел. Операции с такими числами должны производиться по байтам, начиная с младших. Перед выполнением вычитания младших байтов необходимо сбросить флаг C, а при вычитании остальных учитывать состояние флага C, т.е. наличия заема из старших байтов.

Пусть нужно вычесть из содержимого регистра DPTR двухбайтное число 1234H, результат поместить в DPTR. Программа вычитания может иметь вид

MOV A, DPL ; Переслать в аккумулятор младший байт из регистра DPTR

CLR C ; Сбросить флаг переноса C

SUBB A, #34H ; Вычитание младших байтов

MOV DPL, A ; Переслать МлБ разности в регистр DPTR

MOV A, DPH ; Переслать в аккумулятор старший байт из регистра DPTR

SUBB A, #12H ; Вычитание старших байтов

MOV DPH, A ; Переслать СтБ разности в регистр DPTR

NOP

Занесите программу вычитания в память симулятора. Исследуйте работу программы в пошаговом режиме при различных исходных данных в регистре DPTR. Результаты занесите в табл. 5. Флаг C определяется в результате вычитания старших байтов.

Таблица 5

Исходные данные в

DPTR

Результат

DPTR

Флаг C

1235H

1234H

1233H

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]