我尝试做的基本上是在AVR studio4中进行循环,它将0到4F的十六进制数写入连续的内存位置。我使用r16写入值,然后将这些值存储到内存中并继续运行。这就是我到目前为止所拥有的:
.cseg
LDI r16, 0x00 ;Initialize the first value
st x, r16
loop:
inc r16 ;increments the counter by 1
st x, r16 ;stores the data into a memory location
brne loop
done: jmp done
.dseg
.org 200
.db 0x50 ;reserves 50 bits of storage in memory
那么我还需要做些什么来完成这项工作呢?
答案 0 :(得分:1)
您正在使用BRNE
,如果Zero标志清除,它将跳回loop
。但是,当r16
变为0x50时,您在循环中所做的任何操作都不会设置Zero标志。为此,您将使用比较指令:
CPI R16,0x50 ; compare R16 with the immediate 0x50
BRNE loop ; loop if not equal
另一个问题是你说你希望存储值为0x00..0x4F,但是在你将它存储到内存之前你需要递增r16
,所以第一个值是你的#39} ;将存储为1.因此,您应该在inc
和st
之间切换顺序。 (编辑:我没有注意到你在循环之前存储了第一个值。我仍然认为我建议的方式更好,因为它更少代码)子>
此外,您似乎正在将所有值写入同一地址。想要你可能想要的是st x+,r16 ; store indirect and post-increment x
。
总结:
loop:
st x+,r16 ; store indirect and post-increment x
inc r16 ; increments the counter by 1
cpi r16,0x50 ; have we reached beyond the range of numbers that we want to print?
brne loop ; if we haven't, loop again
您尝试为值保留空间的方式也看起来不正确:
.db 0x50 ;reserves 50 bits of storage in memory
.db 0x50
表示您为单个字节保留空间,其值为0x50。要为0x50字节保留空间,您应该使用.byte 0x50
。请参阅Atmel's documentation of the assembler directives。您可能希望在循环之前将这些字节的基址加载到x
。
答案 1 :(得分:0)
您还没有为循环定义结束条件(比较您的循环计数器是否等于0x4f
):
loop:
inc r16 ; increments the counter by 1
st x, r16 ; stores the data into a memory location
cpi r16, 0x4f ; check whether we have written all the bytes
brne loop