#assembly #avr
#сборка #avr
Вопрос:
Как увеличить адрес в SRAM, я хочу хранить данные с неустойчивым количеством данных от 0 до 20.
Пример:
1st data store in $ 60 address
2nd data store in address $ 61
.
.
.
.
.
Спасибо
Комментарии:
1. Используйте косвенную адресацию,
ST
инструкцию.
Ответ №1:
Файл регистра AVR имеет три указателя, которые можно использовать для независимого доступа к данным. Это X (представляющий собой комбинацию регистров r27: r26), Y (r29: r28) и Z (r31: r30).
Оператор LD используется для загрузки данных с адреса, ST для их сохранения.
LDI r27, 0x05 // load 0x0543 into X register
LDI r26, 0x43
LD r16, X // read RAM at address X into register r16
...
ST Y, r16 // store a value from r16 into RAM at address Y
Все три регистра могут использоваться с предварительным или последующим увеличением. Предварительное уменьшение сначала уменьшает значение регистров указателей на 1, а затем получает доступ к данным по этому адресу. После увеличения, наоборот, сначала доступ к данным, затем увеличивает адрес. Синтаксис -X (или -Y / -Z) для предварительного уменьшения и X (или Y / Z ) для последующего увеличения:
LDI r27, 0x02 // Load 0x0200 into X pointer register
LDI r26, 0x00
LD r16, -X // decreases X register, now r27 contains 0x01 and r26 - 0xFF,
// and then reads value of RAM at address 0x01FF into r16
LDI r31, 0x03 // Load 0x0345 into Z pointer register
LDI r30, 0x45
ST Z , r16 // stores value from r16 to address 0x0345, and increment r31:r30 by 1
// now r31 contains 0x03 and r30 - 0x46
Итак, для хранения нескольких данных в последовательных адресах вы можете использовать несколько инструкций после увеличения:
LDI r27, 0x00 // Load 0x0060 into X
LDI r26, 0x60
ST X , r16 // store r16 to 0x0060
ST X , r17 // store r17 to 0x0061
ST X , r18 // store r18 to 0x0062
ST X , r19 // store r19 to 0x0063
etc...