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

Проверьте  правильность работы программы «вручную».

2. При использовании косвенной адресации ячеек памяти подпрограмма сложения будет иметь вид:

DATA1:    EQU      30H       ; Символический адрес МлБ 1-го числа

DATA2:    EQU      38H       ; Символический адрес МлБ 2-го числа

ADD_2:    MOV   R0, #DATA1    ; Загрузить в R0 адрес 1-го числа

MOV   R1, #DATA2    ; Загрузить в R1 адрес 2-го числа

MOV   A, @R0             ; Пересылка в аккумулятор МлБ 1-го числа

ADD    A, @R1            ; Сложение младших байтов

MOV   DPL, A             ; Пересылка МлБ суммы в регистр DPL

INC     R0

INC     R1

MOV   A, @R0            ; Пересылка в аккумулятор СтБ 1-го числа

ADDC  A, @R1           ; Сложение старших байтов

MOV   DPH, A            ; Пересылка СтБ суммы в регистр DPH

RET                              ; Возврат из подпрограммы

END                             ; Конец программного модуля

Запишите подпрограмму ADD_2 в файл add_2.asm. Получите файлы add_2.obj и add_2.hex. Проверьте работу программы с помощью симулятора AVSIM51. Результаты занесите в таблицу по форме табл. 4.3.

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