Небольшой вопрос по обучалке:
Код: Выделить всё
ReadArray:
ldi ZH,High(MyArray*2) ;загрузка адреса 0-го
ldi ZL,Low(MyArray*2) ;элемента в рег. пару Z
ldi Temp1,0
add ZL,Temp ;прибавление
adc ZH,Temp1 ;внутр. адреса
lpm ;загрузка из ПЗУ
mov Temp1,R0 ;копирование
out PortB,Temp1 ;вывод в порт
inc Temp ;увелич. внутр. адреса
rjmp ReadArray ;в начало цикла
MyArray:
.db 12,16,3,4,10,17,255,37,158,14,13,98
.db 14,85,30,9,145,52,64,49,119,72,209,46Помещаем в регистровую пару Z адрес нашего массива, затем к регистру ZL прибавляем смещение,
складываем с учетом переполнения с регистром ZH и с помощью команды lpm загружаем то что нужно из массива.
Вопрос состоит в том, можно ли инициализировать пару один раз, а затем после каждого считывания инкрементить ZL и в следующей
итерации считывать уже другое значение. Будет ли работать или нет?
П. С: представляю себе примерно так:
Код: Выделить всё
ldi ZH,High(MyArray*2) ;загрузка адреса 0-го
ldi ZL,Low(MyArray*2) ;элемента в рег. пару Z, инициализировано где-то выше
ReadArray:
lpm ;загрузка из ПЗУ
mov Temp1,R0 ;копирование
out PortB,Temp1 ;вывод в порт
inc ZL ;увеличили смещение
breq INCZH ;если переполнилось ZL то переходим и инкрементим ZH
rjmp ReadArray ;в начало цикла
INCZH:
inc ZH
rjmp ReadArray
MyArray:
.db 12,16,3,4,10,17,255,37,158,14,13,98
.db 14,85,30,9,145,52,64,49,119,72,209,46