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,有没有解决这个问题的方法?
以下代码:
.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,你可以和的情况下,Y和Z您必须在手术后递增地址或操作前递减它.(增量正是你想要的.)
例:
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)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |