Лабораторна робота №1
Мікропроцесорні системи
Вивчення структурної організації та системи команд мікроконтролерів сімейства МК51
Виконав
Черкасов А.О.
Москва - 2012р.
Завдання
Знайти найбільший елемент масиву, розташованого у внутрішній пам'яті, і зберегти його значення в стеку.
Використовувані регістри і комірки пам'яті
Регістр або осередок памятіНазначеніеR0 (0000h) Адреса поточного елемента масиву. У початковий момент містить адресу початку масиву - 0010h.R1 (0001h) Кількість елементів масиву. Лічильник ітерацій.R2 (0002h) Регістр для тимчасового зберігання даних (елемента масиву, з яким в даній ітерації ведеться робота) .0008hНаібольшій елемент масиву даних, записаний в стек після завершення роботи программи.0010h - 0013hДанние.
Алгоритм розв'язання задачі- адреса початкового елемента массіва- кількість елементів ... dm - елементи масиву
Опис використовуваних команд
MOVRn, #data ??p>
n=0-7
Запис в регістр Rn даних #data.
MOV ad, #data ??p>
Запис за адресою ad даних #data.
MOVA,Rn
n=0-1
Запис з внутрішньої пам'яті даних (ВПД) в акумулятор даних, розташованих за адресою, який міститься в регістрі Rn.
INC Rn
n=0-7
Додаток одиниці до даних, записаних на регістрі Rn.
DEC Rn
n=0-7
Віднімання одиниці з даних, записаних на регістрі Rn.
XCH A, ad
Обмін даними між акумулятором і адресою ad.
JZ rel
Перехід за адресою або мітці rel, якщо на акумуляторі нуль.
MOV ad,Rn
n=0-7
Запис за прямим адресою даних з ВПД, адреса яких записаний в регістрі Rn.
SUBB A, ad
Віднімання з заемом з акумулятора значення, записаного в ВПД за адресою ad.
JBC bit, rel
Перехід за адресою або мітці rel, якщо встановлений біт bit, з очищенням цього біта.
SJMP rel
масив пам'ять програма стек
Безумовний перехід по мітці rel.
PUSH ad
Запис у стек значення, записаного за адресою ad.
Код програми
;// --------------------------------------------------------------//
;// Опис: Lab. Work (ASM Version)//
;// Copyright: MIREA, 1998 - 2000//
;// Процесор: МК 51//
;// Версія: 1.0//
;// Асемблер: A51 v. 6.02//
;// Дата: XX.XX.2001//
;// Коментарі: Файл-заготовка//
;// -------------------------------------------------------------//
;--- Тема програми. Не змінюйте его !!!----
NAME LAB_DEMO
USING 0; Використовувати банк регістрів 0
Jmp Start; Початок програми
ORG 03h
LJmp Ext0Srv; Адреса обробника EXT INT 0
ORG 0BH; Адреса обробника TIMER INT 0
LJmp Time0Srv;
ORG 13H; Адреса обробника EXT INT 1
LJmp Ext1Srv;
ORG 1BH; Адреса обробника TIMER INT 1
LJmp Time1Srv;
ORG 23H; Адреса обробника переривання від
LJmp RiTiSrv; послідовного порту
;--- Конец заголовка ----
; ---------- Тут вводите код програми ----------
; ---------- Ініціалізація ------------------------------
Start: MOV R0, # 0010h; Початкова адреса масиву
MOV R1, # 0004h; Кількість ел-тів
; ---------- Дані --------------------------------------- - 0010h, # 0Ah0011h, # 0Bh0012h, # 07h0013h, # 0Fh
; ---------- Кінець даних -------------------------------
MOV A, @ R0; Перший (еталонний) ел-т - на акумуляторі
; ---------- Кінець ініціалізації --------------------
; ---------- Головний цикл -------------------------------
Loop: INC R0; Наступна адреса ел-та
DEC R1; Декремент кол-ва ел-тів
XCH A, 0001h; Обмін акумулятора і R1 (еталонний ел-т на R1)
JZ EndLoop; Якщо на акумуляторі нуль (ел-ти масиву скінчилися) - кінець програми
XCH A, 0001h; Обмін акумулятора і R1 (еталонний ел-т на A)
MOV 0002h, @ R0; Запис у R2 слід. ел-та, адреса якого на R0
XCH A, 0002h; Обмін акумулятора і R2 (еталонний ел-т на R2)
SUBB A, 0002h; Віднімання з наступного елемента еталонного
XCH A, 0002h; Обмін акумулятора і R2 (еталонний ел-т на A)
JBC cy, Loop; Якщо є перенос (ел-т менше етал...