Разработка алгоритмов работы и программного обеспечения микропроцессорных вычислительных устройств
Написание программного обеспечения на языке ассемблер для AVR-МК ATmega16, позволяющего осуществлять вычисление заданной функции. Введение входных данных с помощью определенного макроса с командой загрузки значений в регистры ldi. Исходный код программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 23.11.2014 |
Размер файла | 521,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Задание
программный обеспечение макрос регистр
Написать программное обеспечение на языке ассемблер для AVR-МК ATmega16, которое бы позволяло осуществлять вычисление функции:
,
где - число из множества целых чисел в диапазоне [0, 250];
- число из множества целых чисел в диапазоне [0, 100];
- число из множества целых чисел в диапазоне [0, 40000];
Значение функции после вычисления должно сохраняться в любых ячейках пользовательского ОЗУ.
Вычисление функции оформить в виде макроса. Входными параметрами макроса должны быть числа , , и адрес ОЗУ для сохранения значения функции.
В программе поочередно вызвать макрос для вычисления значений функции для входных аргументов:
1) ;
2) ;
3) .
Адреса ячеек ОЗУ для задать самостоятельно и указать в пояснительной записке.
Копии экранов с окнами среды AVR Studio, отображающими размещение исходных данных и полученных результатов в ОЗУ, привести в пояснительной записке.
Вычисление «вручную»
1. ; ; ;
Перевод целой части числа заключается в последовательном делении на основание системы на которую осуществляется перевод, до тех пор, пока результат частного деления не станет меньше основания системы с записью в обратном порядке частных остатков от делений.
100/2 (0) = 50/2 (0) = 25/2 (1) = 12/2 (0) = 6/2 (0) = 3/2 (1) = 1/2 (1);
.
250/2 (0) = 125/2 (1) = 62/2 (0) = 31/ 2 (1) = 15/2 (1) = 7/2 (1) = 3/2 (1) = 1/2 (1);
Перемножим
Проверка условия ;
Вычисление = .
2. ; ; ;
10/2 (0) = 5/2 (1) = 2/2 (0) = Ѕ (1);
Перемножим
Проверка условия ;
Вычисление = .
Воспользовались правилом переноса со старших разрядов, правилом вычитания 10 - 1 = 1.
3. ; ; ;
70/2 (0) = 35/2 (1) = 17/2 (1) = 8/2 (0) = 4/2 (0) = 2/2 (0) = Ѕ (1);
50/2 (0) = 25/2 (1) = 12/2 (0) = 6/2 (0) = 3/2 (1) = Ѕ (1);
Перемножим
Проверка условия ;
Вычисление = .
Исходный код программы
;******************************************************************
;* Д/З *
;* Версия: 1.0 *
;* Дата: 17.05.2014 *
;* Автор: Момот О.А. *
;* МК: ATmega16 *
;* Fтакт: 10МГц *
;*****************************************************************
; // Псевдокоманды управления
.DEVICE ATmega16; // Выбор устройства
.NOLIST; // Выключение листинга
.INCLUDE "m16def.inc"; // Присоединение файла описаний
.LIST; // Включение листинга
.DEF temp = R21; // Определение главного рабочего регистра
.DEF valueK = R23; // Определение регистра для значения K
.DEF valueX = R24; // Определение регистра для значения X
.DEF valueBLow = R25; // Определение регистра для значения B (младшего б.)
.DEF valueBHigh = R26; // Определение регистра для значения B (старшего б.)
.DEF valueYLow = R27; // Определение регистра для значения Y (младшего б.)
.DEF valueYHigh = R28; // Определение регистра для значения Y (старшего б.)
.DEF valueYHighHigh = R29; // Определение регистра для значения Y (старшего б. R28)
; // Начало макроса operationY
.MACRO operationY;
mul valueK, valueX; // k*x
cp R1, valueBHigh; // Сравнение R1, valueBHigh
breq variantTwo; // Если k*x = b
cp R1, valueBHigh; // Сравнение R1, valueBHigh
brmi variantOne; // Если k*x < b
brpl variantTwoO; // Если k*x > b
; // Вариант k*x <= b
variantOne:
add valueBLow, R0; // Сложение valueBLow, R0
adc valueBHigh, R1; // Сложение valueBHigh, R1
mov valueYLow, valueBLow; // Копирование valueYLow = valueBLow
mov valueYHigh, valueBHigh; // Копирование valueYHigh = valueBHigh
rjmp outMacro; // Переход на метку outMacro
; // Вариант k*x > b
variantTwo:
cp R0, valueBLow; // Сравнение R0, valueBLow
brpl variantTwoO; // Если + переход
brmi variantOne; // Если - переход
variantTwoO: // Метка variantTwoO
sub R0, valueBlow; // Вычитание R0 - valueBLow
sbc R1, valueBHigh; // Вычитание R1 - valueBHigh
mov valueYLow, R0; // Копирование valueYLow = R0
mov valueYHigh, R1; // Копирование valueYHigh = R1
rjmp outMacro; // Переход на метку outMacro
; // Метка outMacro
outMacro:
; // Конец макроса operationY
.ENDMACRO;
; // Определим значения операторов макроса @0 - адрес ячейки ОЗУ для valueYLow,
; @1 - адрес ячейки ОЗУ для valueYHigh,
; @2 - адрес ячейки ОЗУ для valueYHighHigh.
; // Начало макроса outValues
.MACRO outValues;
sts @0, valueYLow; // Загрузка @0 = valueYLow
sts @1, valueYHigh; // Загрузка @1 = valueYHigh
clr valueYLow; // Очистка valueYLow
clr valueYHigh; // Очистка valueYHigh
; // Конец макроса
.ENDMACRO;
; // Определим значения операторов макроса @0 - значение для valueK,
; @1 - значение для valueX,
; @2 - значение для valueBLow,
; @3 - значение для valueBHigh.
; // Начало макроса ldiRegister
.MACRO ldiRegister
ldi valueK, @0; // Загрузка valueK = @0
ldi valueX, @1; // Загрузка valueX = @1
ldi valueBLow, Low(@2); // Загрузка valueBLow = @2
ldi valueBHigh, High(@2); // Загрузка valueBHigh = @3
; // Конец макроса
.ENDMACRO;
; // Начало программного сегмента
.CSEG; // Выбор сегмента программного кода
.ORG 0; // Установка текущего адреса в ноль
; // Инициализация стека
ldi temp, Low(RAMEND); // Установка младшего б. указателя стека
out SPL, temp; // Запись в SPL = temp
ldi temp, High(RAMEND); // Установка старшего б. указателя стека
out SPH, temp; // Запись в SPH = temp
; // Вызов макроса ldiRegister
ldiRegister 100, 10, 2500; // k = 1000, x = 10, b = 2500
; // Вызов макроса operationY
operationY;
; // Вызов макроса out Values
outValues $60, $61;
; // Холостая команда
nop;
; // Вызов макроса ldiRegister
ldiRegister 1, 100, 10; // k = 1, x = 100, b = 10
; // Вызов макроса operationY
operationY;
; // Вызов макроса out Values
outValues $63, $64;
; // Холостая команда
nop;
; // Вызов макроса ldiRegister
ldiRegister 70, 2, 50; // k = 70, x = 2, b = 50
; // Вызов макроса operationY
operationY;
; // Вызов макроса out Values
outValues $66, $67;
; // Холостая команда
nop;
; // Конец компиляции
.EXIT;
Результат
Вывод
В результате выполнения программы были получены правильные значения, которые были рассчитаны предварительно «вручную»:
1. 0xFA = 250 = 0b11111010;
2. 3. 0x5A = 90 = 0b1011010.
Входные данные вводились с помощью определенного макроса ldiRegister с командой загрузки значений в регистры ldi. Результаты вычислений сохранялись помощью макроса outValues в ячейки ОЗУ с адресами $60, $63, $66 (младший б. результата), $61, $64, $67 (старший б. результата) для соответственно.
Программа писалась в AVR Studio 6.
Размещено на Allbest.ru
Подобные документы
Создание программы для вычисления значения функции на основе определённой формулы. Уточнение структуры входных и выходных данных и определение ассемблерного формата их представления. Разработка алгоритмов для реализации работы программного обеспечения.
курсовая работа [240,6 K], добавлен 17.06.2013Проектирование программного обеспечения, позволяющего создавать и вести множество электронных словарей. Обоснование выбора программных средств решения задачи. Разработка формы входных и выходных данных. Описание модулей программы и процесса отладки.
дипломная работа [1007,7 K], добавлен 03.07.2015Проектирование программного модуля: сбор исходных материалов; описание входных и выходных данных; выбор программного обеспечения. Описание типов данных и реализация интерфейса программы. Тестирование программного модуля и разработка справочной системы.
курсовая работа [81,7 K], добавлен 18.08.2014Обоснование выбора языка программирования. Анализ входных и выходных документов. Логическая структура базы данных. Разработка алгоритма работы программы. Написание программного кода. Тестирование программного продукта. Стоимость программного продукта.
дипломная работа [1008,9 K], добавлен 13.10.2013Разработка программного обеспечения автоматической системы научных исследований (АСНИ) в интегрированной среде программирования Borland C++ Builder 6.0, работающего в среде ОС Windows, позволяющего осуществлять управление процессом спектрального анализа.
курсовая работа [569,3 K], добавлен 05.03.2009Анализ технического задания. Разработка программы по вычислению функции на языке ассемблер для микропроцессора Кр580ВМ80. Алгоритмы программного умножения, деления, сложения, вычитания и сдвига влево многобайтных чисел. Расчет времени работы программы.
курсовая работа [88,2 K], добавлен 19.09.2012Порядок автоматизации расчетов себестоимости и длительности программного обеспечения производственного предприятия. Выбор языка программирования и системы управления базами данных. Разработка алгоритмов расчета себестоимости программного обеспечения.
дипломная работа [1,7 M], добавлен 13.06.2017Анализ затрат и прибыли. Создание программного проекта для решения задачи о прибыли и убытках на языке программирования C#. Использование функций и переменных, компиляция программы. Алгоритмы и структуры данных. Тестирование программного обеспечения.
курсовая работа [1,2 M], добавлен 03.01.2015Изучение языка низкого уровня ассемблер для написания примера программы для 16 битного приложения. Разработка и реализация алгоритма поднесения чисел к степени чисел над полем за основанием 2 (mod 2). Иллюстрация техники создания DOS приложения.
курсовая работа [33,3 K], добавлен 08.11.2011Разработка программного обеспечения для работы с информацией и ее обработкой на языке программирования Delphi. Описание алгоритмов процедуры работы со стеком - добавление, удаление элементов, редактирование записи. Инструкция по использованию программы.
курсовая работа [2,9 M], добавлен 06.02.2013