Assembly 我可以增加SRAM地址吗?

Assembly 我可以增加SRAM地址吗?,assembly,avr,atmel,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 但是,Atmel Studio不允许我增加地址。不必键入30个STS就可以解决此问题

我必须写一个程序,可以存储从地址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
的情况下,您可以,在
Y
Z
的情况下,您必须在操作后增加地址或在操作前减少地址。(递增正是您想要的。)

例如:

ST Y+, R16
如果指令前的R29=2和R28=0x34,则此指令将R16保存到0x234,指令后的R28将为0x35

因此,以下程序应该可以工作(不幸的是,我不熟悉AVR,所以我不确定):

以下代码:

.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
的情况下,您可以,在
Y
Z
的情况下,您必须在操作后增加地址或在操作前减少地址。(递增正是您想要的。)

例如:

ST Y+, R16
如果指令前的R29=2和R28=0x34,则此指令将R16保存到0x234,指令后的R28将为0x35

因此,以下程序应该可以工作(不幸的是,我不熟悉AVR,所以我不确定):


MEM
是一个文本。把它加载到一个寄存器中。我并没有试图增加存储在MEM中的值。我正在尝试访问下一个地址,即0x0201。我理解。但是
MEM
是文本值
0x0200
。你不能增加那个。你需要先把它加载到一个寄存器里,反过来。。。您创建literal MEM=0x200,然后像R18一样将其加载到寄存器中,然后将R18用于STS(我不知道您的CPU,如果
STS R18、R16
合法,或者有其他方法可以使用寄存器值作为存储的内存引用)。然后
inc R18
并循环
MEM
将仅用于该初始加载。显然,我无法将0x200加载到寄存器,因为它超出范围。寄存器的宽度为8位。STS R18、R16是非法的。
MEM
是文字。把它加载到一个寄存器中。我并没有试图增加存储在MEM中的值。我正在尝试访问下一个地址,即0x0201。我理解。但是
MEM
是文本值
0x0200
。你不能增加那个。你需要先把它加载到一个寄存器里,反过来。。。您创建literal MEM=0x200,然后像R18一样将其加载到寄存器中,然后将R18用于STS(我不知道您的CPU,如果
STS R18、R16
合法,或者有其他方法可以使用寄存器值作为存储的内存引用)。然后
inc R18
并循环
MEM
将仅用于该初始加载。显然,我无法将0x200加载到寄存器,因为它超出范围。寄存器的宽度为8位。STS R18,R16是非法的。谢谢你,马丁。所有值都存储在连续的内存位置。谢谢Martin。所有值都存储在连续的内存位置。