- •Лабораторная работа № 6-7 Арифметические команды
- •Цель работы
- •2.Основные теоретические сведения
- •3. Порядок выполнения работы
- •3.1. Исследование команд сложения
- •3.2. Команды вычитания
- •3.3. Команды инкремента
- •3.4. Команды декремента
- •3.4.1. Запишите в память симулятора следующие команды
- •3.5. Команда десятичной коррекции аккумулятора
- •3.6. Команда умножения
- •3.7. Команда деления
- •3.8. Задания для самостоятельной работы
- •4.Содержание отчета
- •Контрольные вопросы
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ДОРОЖНО-СТРОИТЕЛЬНЫЙ КОЛЛЕДЖ имени Ленинского комсомола
Методические указания по выполнению лабораторных работ по дисциплине «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ»
Лабораторная работа № 6-7 Арифметические команды
ГГДСК Гомель 2011
Цель работы
Изучить и практически исследовать арифметические команды однокристальных микроконтроллеров семейства MCS-51 (МК51) на персональном компьютере.
2.Основные теоретические сведения
В микроконтроллерах семейства МК51 имеются следующие команды двоичной арифметики с 8-разрядными числами
сложение
вычитание
инкремент
декремент
умножение
деление.
Операции сложения и вычитания с 8-разрядными операндами предполагают, что один из операндов размещается в регистре A (аккумуляторе), а другой – либо в регистре, либо в оперативной памяти, либо является непосредственным числом, заданным в самой команде. Вычитание производится всегда из аккумулятора. Результат операции сложения и вычитания всегда записывается в аккумулятор. Кроме того, по результату операций сложения и вычитания устанавливаются биты признаков (флаги) C – переноса, AC – дополнительного переноса, P – паритета, OV – переполнения.
Команды инкремента увеличивают содержимое регистров, ячеек памяти на 1. Команды декремента, наоборот, уменьшают содержимое регистров и ячеек памяти на 1. Эти команды не влияют на флаги МК.
Команды умножения и деления выполняют соответствующие операции над однобайтными целыми числами.
К группе арифметических команд МК51 относится также команда десятичной коррекции аккумулятора, которая служит для коррекции результата при сложении десятичных двоично-кодированных чисел.
При ассмотрении арифметических команд будем предполагать, что операнды – двоичные целые числа без знака. Выполнение арифметических операций с дробными числами, а также числами со знаком будет рассмотрено в дальнейших лабораторных работах.
3. Порядок выполнения работы
3.1. Исследование команд сложения
В микроконтроллерах семейства МК51 имеются следующие команды сложения
ADD A, Rn ; (A) (A) + (Rn) – Сложение аккумулятора с регистром (n = 0,…,7)
ADD A, ad ; (A) (A) + (ad) – Сложение аккумулятора с прямоадресуемым байтом
ADD A, @Ri ; (A) (A) + ((Ri)) – Сложение аккумулятора с байтом из ПД (i = 0,1)
ADD A, #d ; (A) (A) + #d - Сложение аккумулятора с константой
ADDC A, Rn ; (A) (A) + (Rn) + (C) – Сложение аккумулятора с регистром и переносом
ADDC A, ad ; (A) (A) + (ad) + (C) – Сложение аккумулятора с прямоадресуемым
байтом и переносом
ADDC A, @Ri ; (A) (A) + ((Ri)) + (C) – Сложение аккумулятора с байтом из ПД и
переносом
ADDC A, #d ; (A) (A) + #d - Сложение аккумулятора с константой и переносом
3.1.1. Рассмотрим команды сложения ADD. При их выполнении предполагается, что 1-е слагаемое находится в аккумуляторе, местонахождение 2-го слагаемого указывается в команде. Результат операции помещается в аккумулятор.
Пример. Допустим, что аккумулятор содержит число ECH, а регистр R2 – число 6EH. Тогда команда ADD A, R2 выполнит сложение следующим образом
Переносы 1 1 1 1 1
Аккумулятор 1 1 1 0 1 1 0 0 = ECH
+
Регистр R2 0 1 1 0 1 1 1 0 = 6EH
--------------------------------------------------------------------------------------------------
Результат 0 1 0 1 1 0 1 0 = 5AH
Установка признаков (флагов) производится микроконтроллером следующим образом. Так как при сложении был перенос из 3-го разряда аккумулятора в 4-й, то устанавливается бит (флаг) дополнительного переноса AC = 1. Так как в полученном результате количество единиц – число четное (4), то флаг паритета сбрасывается P = 0. И, наконец, так как при сложении возник перенос из старшего (7-го) разряда аккумулятора, то устанавливается флаг переноса C = 1. Флаг OV мы рассматривать не будем, так как он используется для операций с числами со знаком.
Рассмотрим примеры сложения однобайтных чисел.
3.1.2. Допустим, необходимо сложить содержимое регистра R7 и ячейки ПД с адресом 30H.
При использовании прямой адресации программа будет иметь вид
MOV A, R7 ; Переслать содержимое R7 в аккумулятор
ADD A, 30H ; Сложение аккумулятора с содержимым ячейки памяти по адресу 30H
NOP
Запишите программу в память симулятора и исследуйте ее работу в пошаговом режиме при различных исходных данных. Результаты занесите в табл. 1.
Таблица 1
-
Исходные данные
Получено
Практически
Теоретически
Регистр R7
Ячейка 30H
Регистр A
Флаг C
Регистр A
Флаг C
11H
55H
CCH
55H
Проверьте правильность работы программы сложения «вручную» по аналогии с п. 3.1.1.
При использовании косвенной адресации программа сложения имеет вид
MOV A, R7 ; Пересылка в аккумулятор
MOV R0, #30H ; Загрузить в регистр R0 адрес ячейки ПД
ADD A, @R0 ; Сложение с содержимым ячейки 30H
NOP
Запишите программу в память симулятора и исследуйте ее работу в пошаговом режиме при различных исходных данных. Результаты занесите в табл. 2.
Таблица 2
-
Исходные данные
Получено
Практически
Теоретически
Регистр R7
Ячейка 30H
Регистр A
Флаг C
Регистр A
Флаг C
11H
55H
CCH
55H
Проверьте правильность работы программы сложения «вручную».
3.1.3. Рассмотрим команды ADDC сложения с учетом переноса C. Эти команды позволяют производить суммирование многобайтных чисел длиной 16, 24 и более разрядов. При этом сложение должно производиться по байтам, начиная с младших.
Так, операция сложения двухбайтных чисел 17F5H и 3411H будет производиться следующим образом
Старший Перенос C Младший HEX-код
байт байт
1-е слагаемое 00010111 11110101 17F5H
+ + +
2-е слагаемое 00110100 00010001 3411H
+ +
Перенос C 1 1
----------------------------------------- -------------- -----------
Результат 01001100 00000110 4C06H
Из рассмотренного примера видно, что при суммировании младших байтов чисел необходимо применять команды ADD, а при сложении остальных – команды ADDC, которые будут учитывать состояние флага переноса C. Если в результате сложения всех байтов установится флаг C=1, то это укажет на переполнение суммы.
Рассмотрим примеры сложения многобайтных двоичных чисел.
1. Нужно сложить два двоичных числа, расположенных в памяти данных. Первое число находится в ячейках 30H (МлБ) и 31H (СтБ). Второе число – в ячейках 38H (МлБ) и 31H (СтБ). Результат сложения (сумму) поместить в регистр DPTR. Подпрограмма сложения с именем ADD_1 при использовании прямой адресации ячеек памяти имеет вид
DATA1: EQU 30H ; олический адрес МлБ 1-го слагаемого
DATA2: EQU 38H ; Символический адрес МлБ 2-го слагаемого
ADD_1: MOV A, DATA1 ; Пересылка в аккумулятор МлБ 1-го числа
ADD A, DATA2 ; Сложение младших байтов
MOV DPL, A ; Пересылка в регистр DPL МлБ суммы
MOV A, DATA1+1 ; Пересылка в аккумулятор СтБ 1-го числа
ADDC A, DATA2+1 ; Сложение старших байтов с учетом переноса
MOV DPH, A ; Пересылка в регистр DPH СтБ суммы
RET ; Возврат из подпрограммы
END ; Конец программного модуля
Так как программа содержит символические имена ячеек ПД, то ее невозможно непосредственно записать в память симулятора. Поэтому выйдите из DOS в WINDOWS и создайте файл add_1.asm, в который запишите текст подпрограммы ADD_1. Затем получите файлы add_1.obj и add_1.hex. Проверьте работу программы с помощью симулятора AVSIM51 в пошаговом режиме, результаты занесите в табл. 3.
Таблица 3
-
Исходные данные
Получено
Практически
Теоретически
Число 1
Число 2
DPTR
Флаг C
DPTR
Флаг C
BBAAH
2211H
BBAAH
DDCCH
Проверьте правильность работы программы «вручную».
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. Результаты занесите в таблицу по форме табл. 3.