Здравствуйте, katbka!
Вот, попробовал ответить...
Я не уверен полностью в правильности, т.к. нет возможности проверить.
Даже не компилировал. Тянуть студию на 500 Мб мне почему-то не захотелось
Пробуйте сами. Если что не так, разберемся
[code h=200]
.include "m8535def.inc"
.equ N=100 ;размерность массива
;Назначим регистрам символические имена
.def counter=r17 ;количество слов
;регистровые пары
.def curr_addr=r30 ;Z=r30-r31: адрес текущего элемента
.def min_addr=r28 ;r28-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
brcs next
;нашли новый минимальный
movw min_addr, save_adr ;сохраним адрес минимального
mov min_lo, curr_lo ;и его значение
mov min_hi, curr_hi
next: ;переходим на анализ следующего элемента
dec counter ;уменьшаем счетчик
brne loop ;циклим, пока counter=r17 не ноль
ret
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен