Так как при сложении кодов переноса из старшего (7-го) разряда результата не было, то устанавливается флаг C = 1. Это будет означать, что при вычитании был заем в старший разряд, т.е. уменьшаемое меньше вычитаемого, а в результате будет отрицательное число в дополнительном коде.
Для проверки правильности результата операции вычитания преобразуем полученное отрицательное число из дополнительного кода в прямой код. Это можно сделать двумя способами:
1) сначала из дополнительного кода вычитается 1 , а затем инвертируются все разряды полученного числа. Имеем:
1111 1111 - дополнительный код
1
-----------------1111 1110 - обратный код.
Инвертируем разряды обратного кода, получим: 0000 0001 = 01H;
2) сначала инвертируем разряды дополнительного кода, а затем к полученному числу прибавляем 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.
Таблица 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. Результаты занесите в табл. 4.5. Флаг C определяется в результате вычитания старших байтов.
Таблица 4.5
Исходные данные в DPTR |
Результат |
|
DPTR |
Флаг C |
|
1235H |
||
1234H |
||
1233H |
3.3. Команды инкремента
Микроконтроллеры семейства МК51 имеют следующие команды инкремента:
INC A ; (A) ß (A) + 1 - Инкремент аккумулятора
INC Rn ; (Rn) ß (Rn) + 1 - Инкремент регистра
INC ad ; (ad) ß (ad) + 1 - Инкремент прямоадресуемого байта
INC @Ri ; ((Ri)) ß ((Ri)) + 1 - Инкремент байта из памяти данных
INC DPTR ; (DPTR) ß (DPTR) + 1 - Инкремент указателя данных
Команды инкремента не влияют на флаги МК (за исключением INC A, которая может изменить флаг паритета P).
3.3.1. Запишите в память симулятора следующие команды:
INC A ; Инкремент аккумулятора
INC R2 ; Инкремент регистра R2
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.