Как увеличить адрес SRAM, например, от 60 до 61-62 в сборке для AVR

#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...