ассамблер
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
(МТУСИ)
Контрольная работа по теме:
«Микропроцессорные системы»
Вариант № 11
Выполнил: Котов Илья Сергеевич
|
|
|
Москва 2018 г.
Задание на контрольную работу
Требуется разработать устройство, которое реализует следующие функции:
-
хранит в памяти массивы однобайтных двоичных чисел ai(i=1…10) и bi(i=1…10);
-
формирует новый массив yi= ai - bi;
-
преобразует yi в ASCII код и выводит в порт;
Алгоритм и программа
Блок-схема алгоритма разработанной программы представлена на Рисунке 1,2. По разработанному алгоритму была написана программа на ассемблере, приведенная в Листинге 1, а машинный код совместно с ассемблером приведен в Листинге 2.
Рис. 1. Алгоритм программы
Рис. 2. Алгоритм программы (продолжение)
Листинг 1
.include "8515def.inc"; заголовочный файл МК AT90S8515
.cseg ; начало сегмента кода
.org $00 ; установить счетчик адреса текущ.сегмента на $00
.def i = r20
init: ; Блок инициализации
ldi i,1 ; i=1
;указатель на a[i]
clr r27 ; очистить старший байт указателя Х
ldi r26,$60 ; в младший байт указателя Х адрес первого числа
;указатель на b[i]
clr r29 ; очистить старший байт указателя Y
ldi r28,$60+$0A ; в младший байт указателя Y адрес первого числа
;указатель на y[i]
clr r31 ; очистить старший байт указателя Z
ldi r30,$60+$0A+$0A; в мл.байт указателя Z адрес первого числа
;настройка стека
ldi r16, low(RamEnd);загрузка значения младшего байта RamEnd в r16
out SPL, r16 ;передача содержимого регистра r16 в младший регистр указателя стека
ldi r16, high(RamEnd);загрузка значения старшего байта RamEnd в r16
out SPH, r16 ;передача содержимого регистра r16 в старший регистр указателя стека
;настройка порта А
ldi r16,$FF
out DDRA,r16 ; Настроим порт А на вывод
next_num:
; Прочитаем a[i] из памяти
ld r16,X+
; Прочитаем b[i] из памяти
ld r17,Y+
; Вычислим y[i]=a[i]-b[i]
sub r16, r17 ; r16=r16-r17
st Z+, r16 ; сохраняем y[i] в память
;преобразуем двоичное число в распакованный 2-10 формат
rcall BIN_to_BCD
ldi r19, $30
add r18, r19 ;преобразуем цифру сотен в ASCII код
out PORTA,r18 ;вывод в порт
add r17, r19 ;преобразуем цифру десятков в ASCII код
out PORTA,r17 ;вывод в порт
add r16, r19 ;преобразуем цифру единиц в ASCII код
out PORTA,r16 ;вывод в порт
inc i ; инкремент
cpi i, 11 ; Если i>10(i=11), то выход из цикла
brlo next_num ; повтор цикла
; Работа программы завершена
sleep
;======= Преобразование из BIN в BCD ===========================
;входное двоичное число (0-255) в r16
;выход r18 – сотни, r17 - десятки, r16 - единицы
BIN_to_BCD:
clr r17 ; Очищаем регистр
clr r18 ; Очищаем регистр
BIN_to_BCD_l:
subi r16,100 ; r16 = r16 — 100
brcs BIN_to_BCD_2
inc r18 ; Инкрементируем r18(сотни)
rjmp BIN_to_BCD_l ; Проходим по циклу проверки заново
BIN_to_BCD_2:
subi r16,-100 ; компенсируем отрицат.значение в r16
BIN_to_BCD_3:
subi r16,10 ; r16 = r16 — 10
brcs BIN_to_BCD_4 ; Прервать, если перенос установлен
inc r17 ; Инкрементируем r17(десятки)
rjmp BIN_to_BCD_3 ; Проходим по циклу проверки заново
BIN_to_BCD_4:
subi r16,-10 ; компенсируем отрицат.значение в r16
ret
Листинг 2
init:
000000 e041 ldi i,1
000001 27bb clr r27
000002 e6a0 ldi r26,$60
000003 27dd clr r29
000004 e6ca ldi r28,$60+$0A
000005 27ff clr r31
000006 e7e4 ldi r30,$60+$0A+$0A
000007 e50f ldi r16, low(RamEnd)
000008 bf0d out SPL, r16
000009 e002 ldi r16, high(RamEnd)
00000a bf0e out SPH, r16
00000b ef0f ldi r16,$FF
00000c bb0a out DDRA,r16
next_num:
00000d 910d ld r16,X+
00000e 9119 ld r17,Y+
00000f 1b01 sub r16, r17
000010 9301 st Z+, r16
000011 d00b rcall BIN_to_BCD
000012 e330 ldi r19, $30
000013 0f23 add r18, r19
000014 bb2b out PORTA,r18
000015 0f13 add r17, r19
000016 bb1b out PORTA,r17
000017 0f03 add r16, r19
000018 bb0b out PORTA,r16
000019 9543 inc i
00001a 304b cpi i, 11
00001b f388 brlo next_num
00001c 9588 sleep
BIN_to_BCD:
00001d 2711 clr r17
00001e 2722 clr r18
BIN_to_BCD_l:
00001f 5604 subi r16,100
000020 f010 brcs BIN_to_BCD_2
000021 9523 inc r18
000022 cffc rjmp BIN_to_BCD_l
BIN_to_BCD_2:
000023 590c subi r16,-100
BIN_to_BCD_3:
000024 500a subi r16,10
000025 f010 brcs BIN_to_BCD_4
000026 9513 inc r17
000027 cffc rjmp BIN_to_BCD_3
BIN_to_BCD_4:
000028 5f06 subi r16,-10
000029 9508 ret