Проверьте правильность работы программы «вручную».
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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.