Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ассамблер

.docx
Скачиваний:
5
Добавлен:
23.06.2018
Размер:
61.09 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»

(МТУСИ)

Контрольная работа по теме:

«Микропроцессорные системы»

Вариант 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