- •Лабораторная работа № 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.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
INC 30H ; Инкремент содержимого ячейки памяти с адресом 30H
INC B ; Инкремент регистра B
MOV R0, #38H ; Загрузить в регистр R0 число 38H (адрес ячейки ПД)
INC @R0 ; Инкремент содержимого ячейки 38H
INC DPTR ; Инкремент регистра DPTR
NOP
Занесите исходные данные в регистры (A) = 10H, (R2) = FFH, (B) = 88H, (DPTR) = 1011H, ячейки памяти данных (30H) = 33H, (38H) = 55H.
Выполните программу в пошаговом режиме, наблюдая за изменением содержания регистров, ячеек памяти и флагов МК. Сделайте выводы о влиянии команд инкремента на флаги МК.
3.4. Команды декремента
Микроконтроллеры семейства МК51 имеют следующие команды декремента
DEC A ; (A) (A) – 1 - Декремент аккумулятора
DEC Rn ; (Rn) (Rn) – 1 - Декремент регистра
DEC ad ; (ad) (ad) – 1 - Декремент прямоадресуемого байта
DEC @Ri ; ((Ri)) ((Ri)) – 1 - Декремент байта из памяти данных
Команды декремента не влияют на флаги МК (за исключением DEC A, которая может изменить флаг паритета P).
Обратите внимание, что в МК51 отсутствует команда декремента регистра-указателя данных DPTR.
3.4.1. Запишите в память симулятора следующие команды
DEC A ; Декремент аккумулятора
DEC R2 ; Декремент регистра R2
DEC 30H ; Декремент содержимого ячейки памяти с адресом 30H
DEC B ; Декремент регистра B
MOV R0, #38H ; Загрузить в регистр R0 число 38H (адрес ячейки памяти)
DEC @R0 ; Декремент содержимого ячейки ПД с адресом 38H
NOP
Занесите исходные данные в регистры (A) = 10H, (R2) = 00H, (B) = FFH и ячейки памяти данных (30H) = AAH, (38H) = 55H.
Выполните программу в пошаговом режиме, наблюдая за изменением содержимого регистров, ячеек памяти и флагов МК. Сделайте выводы о влиянии команд декремента на флаги МК.
3.5. Команда десятичной коррекции аккумулятора
В микроконтроллерах семейства МК51 имеется возможность складывать десятичные числа, представленные в двоично-десятичном коде. Обычно для представления десятичного числа в МК используется так называемый упакованный формат, в котором байт разбивается на две тетрады. При этом младшая тетрада определяет младшую десятичную цифру в двоично-десятичном коде, а старшая тетрада – старшую цифру в двоично-десятичном коде. Диапазон представления десятичных чисел в упакованном формате составляет от 0 до 99. Пример записи чисел в упакованном формате
1001 0111 = 97,
0010 1000 = 28.
Десятичные двоично-кодированные числа в упакованном формате можно складывать с применением команд сложения ADD и ADDC. Однако после этого требуется проводить коррекцию результата, так как эти команды выполняют сложение по правилам двоичной арифметики.
Коррекция результата сложения выполняется с помощью команды DA A по следующим правилам в 2 этапа
на 1-м этапе проводится коррекция младшей тетрады содержимого аккумулятора при этом, если ее значение получилось более 9 или установлен флаг дополнительного переноса AC = 1, то к содержимому аккумулятора добавляется число 6 (0110 в двоичном коде)
на 2-м этапе проводится коррекция старшей тетрады при этом, если ее значение больше 9 или установлен флаг переноса C = 1, то к содержимому старшей тетрады аккумулятора добавляется число 6 (0110 в двоичном коде).
Пример. Пусть в аккумуляторе находится число 79H (десятичное число 79 в упакованном формате). Требуется сложить его с числом 38H (десятичное число 38 в упакованном формате). Команда сложения ADD A, #38H выполняется следующим образом
Переносы 1 1 1 1 1
0 1 1 1 1 0 0 1
+
0 0 1 1 1 0 0 0
---------------------------------------------------
1 0 1 1 0 0 0 1
Полученный результат не является двоично-десятичным кодом.
Выполним коррекцию результата сложения с помощью команды DA A.
На 1-м этапе производим коррекцию младшей тетрады содержимого аккумулятора. Поскольку при сложении был перенос из 3-го разряда, т.е. установлен флаг AC = 1, то к младшей тетраде прибавляется число 6
1011 0001
+
0110
----------------
0111
На 2-м этапе производим коррекцию старшей тетрады содержимого аккумулятора. Поскольку старшая тетрада больше 9, то к ней прибавляется число 6
Переносы 1 1 1 1
1 0 1 1 0 1 1 1
+
0 1 1 0
------------------------------------------------------------
0 0 0 1 0 1 1 1
Таким образом, в аккумуляторе будет число 17H (десятичное число 17 в упакованном формате), а флаг переноса окажется установлен C = 1.
Проверим результат сложения по правилам десятичной арифметики 79 + 38 = 117.
Результат получен правильный. Следует отметить, что команда DA A корректирует результат только сложения десятичных двоично-кодированных чисел. Коррекция результата вычитания десятичных чисел выполняется по специальным программам.
3.5.1. Занесите в память симулятора коды программы сложения двух десятичных чисел 53 и 39
MOV A, #53H ; Загрузить в аккумулятор число 53H
ADD A, #39H ; Сложение с числом 39H
DA A ; Десятичная коррекция аккумулятора
NOP
Выполните программу сложения в пошаговом режиме без команды десятичной коррекции аккумулятора. Занесите содержимое аккумулятора в левую колонку табл. 6.
Таблица 6
-
Содержимое аккумулятора
Получено практически
Получено теоретически
Без коррекции
С коррекцией
Без коррекции
С коррекцией
Затем выполните программу сложения с командой коррекции содержимого аккумулятора. Занесите результат также в табл. 6.
Выполните проверку правильности работы программы «вручную». Сначала проведите сложение по правилам двоичной арифметики, а затем произведите десятичную коррекцию содержимого аккумулятора. Результаты занесите в табл. 6. Проанализируйте полученные результаты.