为什么不能使用存储指令.db,.dw来声明要存储在SRAM中的变量?

时间:2014-12-08 19:46:20

标签: assembly avr

嘿,伙计们正在进行决赛,我不知道如何回答这个问题。我知道答案是否定的,但我不知道为什么!

2 个答案:

答案 0 :(得分:1)

因为您的程序被写入闪存(也就是程序存储器),所以您只能在那里定义数据。当然,您可能有一个初始化例程,它将一系列字节从flash复制到sram,您的工具链甚至可能透明地支持这种用法。例如,avr-gcc工具链使用.data部分。

鉴于此C代码片段:

static unsigned char foo[] = { 1, 4, 9, 16 };

avr-gcc将创建以下汇编代码(摘录):

        .data
        .type   foo.1351, @object
        .size   foo.1351, 4
foo.1351:
        .byte   1
        .byte   4
        .byte   9
        .byte   16

当然,最终的程序会将此部分嵌入flash中。工具链创建一个初始化程序例程,将例程复制到sram,代码需要它:

00000000 <__ctors_end>:
   0:   10 e0           ldi     r17, 0x00
   2:   a0 e6           ldi     r26, 0x60
   4:   b0 e0           ldi     r27, 0x00
   6:   e2 e2           ldi     r30, 0x22
   8:   f0 e0           ldi     r31, 0x00
   c:   c8 95           lpm
   e:   31 96           adiw    r30, 0x01
  10:   0d 92           st      X+, r0
  12:   a4 36           cpi     r26, 0x64
  14:   b1 07           cpc     r27, r17
  16:   d1 f7           brne    .-12

这是一个循环,使用lpm从flash读取,st X+, r0写入sram。

答案 1 :(得分:0)

我不知道您正在使用哪个工具集,但是在Microsoft / ARM /和许多其他工具集的情况下结合某种类型的exe2bin实用程序来生成嵌入式软件的rom映像,然后使用db,dw ,dd,dq,对于SRAM中的数据不是问题。生成的代码将包括在启动时将ROM / EPROM / EEPROM / FLASH映像中的数据复制到SRAM中的代码。对于未初始化的内存,您可以使用?对于诸如|的值D b ? |或者dw? |。这些通常进入.BSS(由符号开始的块)段。启动代码将未初始化的内存区域清零是很常见的,因此它也可以在.BSS部分中放置静态变量。