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

Assembly 为什么不能使用存储指令.db、.dw来声明要存储在SRAM中的变量?,assembly,avr,Assembly,Avr,嘿,大家都在准备期末考试,我不知道怎么回答这个问题。我知道答案是否定的,但我不知道为什么 我不知道您使用的是哪种工具集,但在Microsoft/ARM/和许多其他工具集与某种类型的exe2bin实用程序结合为嵌入式软件生成rom映像的情况下,使用db、dw、dd、dq对于SRAM中的数据来说不是问题。生成的代码将包括在启动时将数据从ROM/EPROM/EEPROM/闪存映像复制到SRAM中的代码。对于未初始化的内存,您可以使用?对于| db?|等值或者| dw?|。它们通常进入.BSS(以符号开

嘿,大家都在准备期末考试,我不知道怎么回答这个问题。我知道答案是否定的,但我不知道为什么

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

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

给定此C代码片段:

static unsigned char foo[] = { 1, 4, 9, 16 };
avr gcc
将创建以下汇编代码(摘录):

当然,最终的程序将在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
00000000:
0:10 e0本地设计院r17,0x00
2:a0 e6本地设计院r26,0x60
4:b0 e0本地设计院r27,0x00
6:e2本地设计院r30,0x22
8:f0 e0本地设计院r31,0x00
c:c8 95 lpm
e:3196平硐r30,0x01
10:0d 92 st X+,r0
12:a4 36消费物价指数r26,0x64
14:b1 07 cpc r27,r17
16:d1 f7 brne.-12
这是一个使用
lpm
从闪存读取和
stx+,r0
写入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