我可以递增 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
,你可以,如果是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
我必须编写一个程序,可以在从地址 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,所以我不确定):
LDI R29, 2 # High byte of "MEM"
LDI R28, 0 # Low byte of "MEM"
L1: INC R16
ST Y+, R16
DEC R17
BRNE L1