Добрый день! Помогите пожалуйста создать код считывания массива из памяти с начала массива данных и с его конца. мой массив: massiv: .DB 0x00,0x18,0x3C,0x7E,0xFF,0x7E,0x3C,0x18
Нашел пару примеров, но ничего не понимаю, каков же алгоритм считывания(( И в чем отличие например между ldi ZH, High(Array*2) и ldi ZH,High(Array<<1)? Что означает lpm Z+?
Заранее, спасибо!
Вложения:
Комментарий к файлу: Примеры, которые видел Чтение массива.txt [1.56 KiB]
Скачиваний: 276
ldi ZH, High(Array*2) и ldi ZH,High(Array<<1) это разные формы записи одного и того же. lpm Z+ означает, что после чтения байта из массива значение ZH:ZL увеличится на единицу.
не смешите мои тапки! какой еще алгоритм, кроме: 1 задали в Z адрес начала массива 2 считали значение по адресу Z 3 увеличили Z - т.е. взяли адрес следующего 4 если все данные не считаны - перешли к п.2
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
не смешите мои тапки! какой еще алгоритм, кроме: 1 задали в Z адрес начала массива 2 считали значение по адресу Z 3 увеличили Z - т.е. взяли адрес следующего 4 если все данные не считаны - перешли к п.2
Человеку вроде надо и в обратном порядке считать... Так как команда LPM не работает с аргументом "-Z" считывать надо в две команды, примерно так:
Код:
... Read_Massiv: LPM R16,Z ; чтение без изменения Z SBIW ZH:ZL,0x01 ;уменьшение Z на 1 DEC R17 ...
Если весь массив лежит в пределах адресов XX00-XXFF, то можно вместо SBIW сделать просто DEC ZL (на 1 такт быстрее). Или написать тот же массив задом наперед и читать просто LPM R16,Z+ (если быстродействие важнее) Если есть свободная память - загрузить массив туда при старте, команды LD понимают аргументы с минусом и работают быстрее.
Человеку вроде надо и в обратном порядке считать... Так как команда LPM не работает с аргументом "-Z" считывать надо в две команды, примерно так:
Код:
... Read_Massiv: LPM R16,Z ; чтение без изменения Z SBIW ZH:ZL,0x01 ;уменьшение Z на 1 DEC R17 ...
Если весь массив лежит в пределах адресов XX00-XXFF, то можно вместо SBIW сделать просто DEC ZL (на 1 такт быстрее). Или написать тот же массив задом наперед и читать просто LPM R16,Z+ (если быстродействие важнее) Если есть свободная память - загрузить массив туда при старте, команды LD понимают аргументы с минусом и работают быстрее.
УРАААА!!!! Получилось!!!!!! Эврика!))
SBIW ZH:ZL,0x01 ;уменьшение Z на 1 LPM R16,Z ; чтение без изменения Z
Заработало!!!!!
Engineer_Keen, огромнейшее спасибо!
Вот у вас есть интересный способ - если есть свободная память -> загрузить массив туда при старте. Это каким образом можно было бы сделать? И еще - как мне узнать впределах каких адресов лежит моя программа? Я использую AVR Studio - это там надо смотреть?
Человеку вроде надо и в обратном порядке считать... Так как команда LPM не работает с аргументом "-Z" считывать надо в две команды, примерно так:
Код:
... Read_Massiv: LPM R16,Z ; чтение без изменения Z SBIW ZH:ZL,0x01 ;уменьшение Z на 1 DEC R17 ...
Если весь массив лежит в пределах адресов XX00-XXFF, то можно вместо SBIW сделать просто DEC ZL (на 1 такт быстрее). Или написать тот же массив задом наперед и читать просто LPM R16,Z+ (если быстродействие важнее) Если есть свободная память - загрузить массив туда при старте, команды LD понимают аргументы с минусом и работают быстрее.
УРАААА!!!! Получилось!!!!!! Эврика!))
SBIW ZH:ZL,0x01 ;уменьшение Z на 1 LPM R16,Z ; чтение без изменения Z
Заработало!!!!!
Engineer_Keen, огромнейшее спасибо!
Если есть свободная память -> загрузить массив туда при старте. Это с помощью каких операторов можно было бы сделать? И еще - как мне узнать впределах каких адресов лежит моя программа? RESPECT.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения