- •Лабораторная работа № 6-7 Арифметические команды
- •Цель работы
- •2.Основные теоретические сведения
- •3. Порядок выполнения работы
- •3.1. Исследование команд сложения
- •3.2. Команды вычитания
- •3.3. Команды инкремента
- •3.4. Команды декремента
- •3.4.1. Запишите в память симулятора следующие команды
- •3.5. Команда десятичной коррекции аккумулятора
- •3.6. Команда умножения
- •3.7. Команда деления
- •3.8. Задания для самостоятельной работы
- •4.Содержание отчета
- •Контрольные вопросы
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 , а затем инвертируются все разряды полученного числа. Имеем
1111 1111 - дополнительный код
-
1
------------------
1111 1110 - обратный код.
Инвертируем разряды обратного кода, получим 0000 0001 = 01H;
сначала инвертируем разряды дополнительного кода, а затем к полученному числу прибавляем 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