我可以增加SRAM地址吗?

sni*_*ben 0 assembly avr atmel

我必须编写一个程序,可以从地址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
Run Code Online (Sandbox Code Playgroud)

但是,Atmel Studio不允许我递增地址.没有必须输入30个STS,有没有解决这个问题的方法?

Mar*_*nau 5

以下代码:

.EQU MEM = 0x0200
   ...
STS MEM, R16
INC MEM
Run Code Online (Sandbox Code Playgroud)

......实际上意味着:

STS 0x200, R16
INC 0x200
Run Code Online (Sandbox Code Playgroud)

...当然你不能增加常数0x200.常量0x200将始终为0x200; 它永远不会是0x201.

STS指令仅允许您将数据存储到固定的固定地址.

ST但是,该指令允许您在X(R27:R26), Y(R29:R28)或Z(R31:R30)寄存器对中指定地址.

在的情况下X,你可以和的情况下,YZ必须在手术后递增地址或操作前递减它.(增量正是你想要的.)

例:

ST Y+, R16
Run Code Online (Sandbox Code Playgroud)

如果在指令之前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
Run Code Online (Sandbox Code Playgroud)