Вопрос № 182479: Здравствуйте! Прошу помощи в следующем вопросе: В массиве, состоящим из N 16-разрядных кодов, определить минимальный элемент и зафиксировать его адрес. Массив находится во внешнем ОЗУ . оформить как подпрограмму. Параметры подпрограмм хра...
Вопрос № 182479:
Здравствуйте! Прошу помощи в следующем вопросе: В массиве, состоящим из N 16-разрядных кодов, определить минимальный элемент и зафиксировать его адрес. Массив находится во внешнем ОЗУ . оформить как подпрограмму. Параметры подпрограмм хранить в свободной зоне внутренней памяти данных. Микроконтроллер ATmega8535.
Отправлен: 12.03.2011, 07:52
Вопрос задал: katbka (1-й класс)
Всего ответов: 1 Страница вопроса »
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, katbka! Вот, попробовал ответить... Я не уверен полностью в правильности, т.к. нет возможности проверить. Даже не компилировал. Тянуть студию на 500 Мб мне почему-то не захотелось Пробуйте сами. Если что не так, разберемся
Код:
.include "m8535def.inc"
.equ N=100 ;размерность массива
;Назначим регистрам символические имена .def counter=r17 ;количество слов ;регистровые пары .def curr_addr=r30 ;Z=r30-r31: адрес текущего элемента .def min_addr=r28 ;r
28-r29: адрес минимального элемента .def save_addr=r26 ;r26-r27: сохраненный адрес текущего элемента ;одиночные .def work=r16 ;временный регистр .def curr_lo=r18 ;r18-r19: текущее слово .def curr_hi=r19 .def min_lo=r20 ;r20-r21: минимальный элемент .def min_hi=r21
.ESEG ;сегмент в EEPROM array: .db 1,0 ;... задаем 100 слов (предоставляю Вам право набить 200 байт )
.CSEG ;кодовый
сегмент rjmp Start
Start: ;точка входа ldi R16, low(RAMEND) ;зададим стек out SPL, R16 ldi R16, high(RAMEND) out SPH, R16
;Зададим адрес массива и число элементов ;результат в min_addr = r28:r29 ;само значение в r20:r21 ldi ZL, low(array) ;мл байт адреса массива ldi ZH, high(array) ;ст байт адреса массива ldi counter, $N ;количество call min ;ищем адрес минимально
го элемента
wait: jmp wait ;зацикливаемся
min: ;поиск адреса минимального элемента mov min_lo, $0ffh ;min = заведомо самому большому числу (0ffffh) mov min_hi, $0ffh
loop: ;цикл по всем элементам movw save_addr, curr_addr ;сохраним адрес текущего элемента ld curr_lo, Z+ ;мл байт текущего элемента ld curr_hi, Z+ ;ст байт текущего элемента cp curr_hi, min_hi cpc curr_lo, min_lo brge next ;нашли новый минимальный movw min_addr, save_adr ;сохраним адрес минимального mov min_lo, curr_lo ;и его значение mov min_hi, curr_hi next: ;переходим на анализ следующего элемента dec counter ;уменьшаем счетчик brne loop ;циклим, пока counter=r17 не ноль ret
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 21.03.2011, 15:59
Номер ответа: 266344 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 266344
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.