我必须编写一个程序,该程序可以在地址从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可以解决此问题吗?
答案 0 :(得分:5)
以下代码:
.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