Однокристальные микроконтроллеры семейства MCS-51. Арифметические команды. Операции сложения и вычитания с 8-разрядными операндами, страница 5

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

---------------1011  0111