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

Так как при сложении кодов переноса из старшего (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