我可以递增 SRAM 地址吗?

Can I increment an SRAM address?

我必须编写一个程序,可以在从地址 0x0200 开始的 SRAM 中存储从 11 到 40 的连续整数。

这是我尝试用汇编语言做的事情:

    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 就可以解决这个问题的方法?

以下代码:

.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,你可以,如果是YZ,你必须 运算后地址自增或运算前自减。 (递增正是您想要的。)

示例:

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