Здравствуйте.
Поставил тут меня в тупик один маленький вопросец:
Значит для использования в команде lpm нужно предварительно загнать в регистр Z нужный адрес.
Нужный адрес предполагается формировать из адреса таблицы и номера элемента этой таблицы.
Вопрос в том, как прибавить к регистровой паре Z восьмибитное число (num), хранящееся в каком-нибудь из РОН-ов.
Вот если бы я хранил адрес не в Z а в двух других РОН, вопросов у меня не возникло бы (команды add, затем adc).
Но как работает сложение в регистровой паре?
Может действовать также как и с разными РОН командами add и adc, но переносится ли бит переноса автоматом или нет в паре я инфы не нашел.
Конечно для 100% надежности можно поступить так: предварительно записать адрес в двух РОН, там произвести манипуляции над адресом, затем перенести побайтно в регистр Z. Но при этом тратится 2 "лишних" регистра.
Хотелось бы произвести сложение в самом регистре Z.
Будет ли работать этот код (строки 4...8):
использование таблицы в программе
таблицы (в конце программного кода)
Раздел: AVR
Поставил тут меня в тупик один маленький вопросец:
Значит для использования в команде lpm нужно предварительно загнать в регистр Z нужный адрес.
Нужный адрес предполагается формировать из адреса таблицы и номера элемента этой таблицы.
Вопрос в том, как прибавить к регистровой паре Z восьмибитное число (num), хранящееся в каком-нибудь из РОН-ов.
Вот если бы я хранил адрес не в Z а в двух других РОН, вопросов у меня не возникло бы (команды add, затем adc).
Но как работает сложение в регистровой паре?
Может действовать также как и с разными РОН командами add и adc, но переносится ли бит переноса автоматом или нет в паре я инфы не нашел.
Конечно для 100% надежности можно поступить так: предварительно записать адрес в двух РОН, там произвести манипуляции над адресом, затем перенести побайтно в регистр Z. Но при этом тратится 2 "лишних" регистра.
Хотелось бы произвести сложение в самом регистре Z.
Будет ли работать этот код (строки 4...8):
использование таблицы в программе
1 .def num = R16 ; номер элемента в таблице
2 .def data = R17 ; данные по номеру num из таблицы
....
4 ldi ZL, low(tab1*2) ; обращение к первой таблице по метке tab1 (умножаем на два чтобы перейти к побайтной адресации)
5 ldi ZH, high(tab1*2)
6 add ZL, num ; прибавляем к адресу начала таблицы номер интересуемого элемента таблицы
7 ldi temp, 0
8 adc ZH, ldi ; т.к. номер таблицы 8-ми битный то прибавляем ноль чтобы прибавился флаг переноса (если есть)
9 lpm data, Z ; наконец достаем сами данные из таблицы
таблицы (в конце программного кода)
tab1: .dw <...сами данные...>
...
tabN: .dw <...данные...>
Раздел: AVR