Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР_6-7.doc
Скачиваний:
8
Добавлен:
27.09.2019
Размер:
169.98 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ДОРОЖНО-СТРОИТЕЛЬНЫЙ КОЛЛЕДЖ имени Ленинского комсомола

Методические указания по выполнению лабораторных работ по дисциплине «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ»

Лабораторная работа № 6-7 Арифметические команды

ГГДСК Гомель 2011

  1. Цель работы

Изучить и практически исследовать арифметические команды однокристальных микроконтроллеров семейства MCS-51 (МК51) на персональном компьютере.

2.Основные теоретические сведения

В микроконтроллерах семейства МК51 имеются следующие команды двоичной арифметики с 8-разрядными числами

  1. сложение

  2. вычитание

  3. инкремент

  4. декремент

  5. умножение

  6. деление.

Операции сложения и вычитания с 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]