Могу ли я увеличить адрес SRAM? - PullRequest
0 голосов
/ 01 февраля 2019

Мне нужно написать программу, которая может хранить последовательные целые числа, начиная с 11 до 40, в SRAM, начиная с адреса 0x0200.

Это то, что я пытался сделать на языке ассемблера:

    LDI R16, 10
    LDI R17, 30             
   .EQU MEM = 0x0200      

L1: INC R16
    STS MEM, R16
    INC MEM
    DEC R17
    BRNE L1

L2: jmp L2

Однако Atmel Studio не позволяет мне увеличивать адрес.Есть ли решение этой проблемы без необходимости ввода 30 STS?

1 Ответ

0 голосов
/ 01 февраля 2019

Следующий код:

.EQU MEM = 0x0200
   ...
STS MEM, R16
INC MEM

... фактически означает:

STS 0x200, R16
INC 0x200

... и, конечно, вы не можете увеличить константу 0x200.Константа 0x200 всегда будет 0x200;оно никогда не будет 0x201.

Инструкция STS позволяет сохранять данные только по постоянному постоянному адресу .

Однако инструкция ST позволяет вамуказать адрес в регистрах пар X (R27: R26), Y (R29: R28) или Z (R31: R30).

В случае X you может , а в случае Y и Z вы должны увеличить адрес после операции или уменьшить его перед операцией.(И приращение - это именно то, что вам нужно.)

Пример:

ST Y+, R16

Если R29 = 2 и R28 = 0x34 перед инструкцией, эта инструкция сохранит R16 в 0x234, а R28 будет0x35 после инструкции.

Так что следующая программа должна работать (к сожалению, я не знаком с AVR, поэтому я не уверен):

    LDI R29, 2    # High byte of "MEM"
    LDI R28, 0    # Low byte of "MEM"
L1: INC R16
    ST Y+, R16
    DEC R17
    BRNE L1
...