AVR汇编语言 - 如何将数据位存储到内存中

时间:2015-10-02 05:45:39

标签: assembly storage increment avr

我尝试做的基本上是在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

那么我还需要做些什么来完成这项工作呢?

2 个答案:

答案 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.因此,您应该在incst之间切换顺序。 编辑:我没有注意到你在循环之前存储了第一个值。我仍然认为我建议的方式更好,因为它更少代码)
此外,您似乎正在将所有值写入同一地址。想要你可能想要的是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