Регистр
или ячейка памяти
|
Назначение
|
R0 (0000h)
|
Адрес
текущего элемента массива. В начальный момент содержит адрес начала массива -
0010h.
|
R1 (0001h)
|
Количество
элементов массива. Счетчик итераций.
|
R2 (0002h)
|
Регистр
для временного хранения данных (элемента массива, с которым в данной итерации
ведется работа).
|
0008h
|
Наибольший
элемент массива данных, записанный в стек после завершения работы программы.
|
0010h-0013h
|
Данные.
|
Алгоритм
решения задачи- адрес начального элемента массива- количество элементов…dm -
элементы массива
Описание
используемых команд
MOVRn, #data
n = 0-7
Запись
в регистр Rn данных #data.
MOV ad, #data
Запись
по адресу 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
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; Если есть
перенос (эл-т меньше эталонного) - переходим к следующему элементу
MOV A, @R0; Иначе -
записываем значение в аккумулятор
sjmp Loop; Переходим
к след. эл-ту
EndLoop:PUSH 0001h; Запись результата
в стек
sjmp EndlessLoop
EndlessLoop:sjmp EndlessLoop;
Бесконечный цикл
;----------
Конец главного цикла-------------------
;----------
Конец программы------------------------
;
Обработчики прерываний.
Ext1Srv: RETI
Time0Srv: RETI
Time1Srv: RETI: RETISrv: RETI: RETI