Assembly 为什么不能使用存储指令.db、.dw来声明要存储在SRAM中的变量?
嘿,大家都在准备期末考试,我不知道怎么回答这个问题。我知道答案是否定的,但我不知道为什么 我不知道您使用的是哪种工具集,但在Microsoft/ARM/和许多其他工具集与某种类型的exe2bin实用程序结合为嵌入式软件生成rom映像的情况下,使用db、dw、dd、dq对于SRAM中的数据来说不是问题。生成的代码将包括在启动时将数据从ROM/EPROM/EEPROM/闪存映像复制到SRAM中的代码。对于未初始化的内存,您可以使用?对于| db?|等值或者| dw?|。它们通常进入.BSS(以符号开头的块)段。启动代码通常会将未初始化的内存区域归零,因此它也可以将静态变量放在.BSS部分。因为您的程序被写入闪存(也称为程序内存),所以您只能在闪存中定义数据。当然,您可能有一个将一系列字节从闪存复制到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(以符号开
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