我可以增加一个SRAM地址吗?

时间:2019-02-01 16:45:34

标签: 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可以解决此问题吗?

1 个答案:

答案 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,您可以;对于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