Автор работы: Пользователь скрыл имя, 29 Мая 2013 в 00:39, лабораторная работа
Цель работы: изучение команд арифметических и логических опе-раций, сдвигов и битовых операций, практическое освоение приемов программирования на ассемблере, изучение директив.
Лабораторная работа №2 по «Микропроцессорным системам». Микроконтроллер ATmega128: команды обработки данных |
Студент |
|
Группа |
||
Дата |
||
Преподаватель |
||
Подпись |
||
Оценка |
Цель работы: изучение команд арифметических и логических операций, сдвигов и битовых операций, практическое освоение приемов программирования на ассемблере, изучение директив.
Задание: выбрать числа с минимальным и максимальным значением из массива, содержащего 40 16-разрядных чисел со знаком, которые размещены в памяти, начиная с адреса $хх. Минимальное и максимальное число записать в регистры R20. R21, а порядковые номера этих чисел в исходном массиве данных - в регистры R22 и R23.
Код программы:
.include "m128def.inc"
.equ IniX = $100 ;указатель на память данных
.equ N = 40 ;счетчик циклов
;человеческие имена для
.def Counter = R16 ;счетчик
.def MinHigh = R20 ;старший байт минимума
.def MinLow = R19 ;младший байт минимума
.def MaxHigh = R21 ;старший байт максимума
.def MaxLow = R18 ;младший байт максимума
.def MinPos = R22 ;номер позиции минимума
.def MaxPos = R23 ;номер позиции максимума
.def tmp = R17 ;регистр, нужный для хранения текущего значения
;по X (для операций сравнения)
.ORG 0
ldi R26,low(IniX) ;загрузка рег.X значением указателя на память
;данных
ldi R27,high(IniX)
ldi Counter,0 ;загрузка счетчика циклов
;инициализация цикла
ld MaxHigh,X ;загрузка значений максимума и минимума
ld MinHigh,X+
ld MaxLow,X
ld MinLow,X+
mov MaxPos,Counter
mov MinPos,Counter
inc Counter
loop: ;цикл поиска макс. и мин. числа
;проверка числа на максимум
ld tmp,X
MaxCheck:
cp MaxHigh,tmp
breq MaxHighEqual
brlt MaxHighLess
MaxHighMore: ;если старший байт максимума больше
;старшего байта числа
jmp MinCheck ;то проверяем число на минимум
MaxHighEqual: ;если старший байт максимума равен
;старшему байту числа
adiw X,1 ;то сравниваем младшие байты максимума и
;числа
ld tmp,X
cp MaxLow,tmp
breq MaxLowEqual
brlo MaxLowLess
MaxLowMore:
sbiw X,1
jmp MinCheck
MaxLowEqual:
sbiw X,1
jmp MinCheck
MaxLowLess:
ld MaxLow,X
mov MaxPos,Counter
sbiw X,1
jmp NextNumber
MaxHighLess: ;если старший байт максимума меньше
;старшего байта числа
ld MaxHigh,X ;то число - новый максимум, переходим к ;следующему числу
adiw X,1
ld MaxLow,X
mov MaxPos,Counter
sbiw X,1
jmp NextNumber
;проверка числа на минимум
MinCheck:
ld tmp,X
cp MinHigh,tmp ;сравниваем старшие байты минимума и числа
breq MinCheckEqual
brlt MinCheckLess
MinCheckMore: ;если старший байт минимума больше
;старшего байта числа,
mov MinHigh, tmp ;то число - новый минимум, переходим к
;следующему числу
adiw X,1
mov MinLow, tmp
mov MinPos,Counter
sbiw X,1
jmp NextNumber
MinCheckEqual: ;если старший байты минимума и числа
;равны,
adiw X,1 ;то сравниваем младшие байты
ld tmp,X
cp MinLow,tmp
breq MinLowEqual
brlo MinLowLess
MinLowMore:
mov MinLow,tmp
mov MinPos,Counter
sbiw X,1
jmp NextNumber
MinLowEqual:
MinLowLess:
sbiw X,1
jmp NextNumber
MinCheckLess: ;если старший байт минимума меньше
;старшего байта числа,
jmp NextNumber ;то переходим к следующему числу
NextNumber: ;переход к следующему числу
adiw X,2
inc Counter
cpi Counter,N
brne loop
End: rjmp End
Информация о работе Микроконтроллер ATmega128: команды обработки данных