gpt4 book ai didi

assembly - 什么是数据段初始值设定项?

转载 作者:行者123 更新时间:2023-12-02 21:32:36 25 4
gpt4 key购买 nike

我正在为 STM32F3Discovery 板上运行的裸机应用程序构建链接器脚本。它使用位于 STM32Cube_FW_F3 包中的 CMSIS 驱动程序的启动代码,即 stm32f303xc.s 文件。

上面的文件(其片段粘贴在下面)引用了 _sidata:

/* start address for the initialization values of the .data section.
defined in linker script */
.word _sidata
/* start address for the .data section. defined in linker script */
.word _sdata
/* end address for the .data section. defined in linker script */
.word _edata
/* start address for the .bss section. defined in linker script */
.word _sbss
/* end address for the .bss section. defined in linker script */
.word _ebss

对数据和 bss 部分的开始和结束的引用是不言自明的,另一方面,我无法找到有关数据段初始值设定项的任何信息。复位后设置 SP 后直接使用。

stm32f303xc.s

.section .text.Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
ldr sp, =_estack /* Atollic update: set stack pointer */

/* Copy the data segment initializers from flash to SRAM */
movs r1, #0
b LoopCopyDataInit

CopyDataInit:
ldr r3, =_sidata
ldr r3, [r3, r1]
str r3, [r0, r1]
adds r1, r1, #4

LoopCopyDataInit:
ldr r0, =_sdata
ldr r3, =_edata
adds r2, r0, r1
cmp r2, r3
bcc CopyDataInit
ldr r2, =_sbss
b LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
movs r3, #0
str r3, [r2], #4

LoopFillZerobss:
ldr r3, = _ebss
cmp r2, r3
bcc FillZerobss

/* Call the clock system intitialization function.*/
bl SystemInit
/* Call static constructors */
bl __libc_init_array
/* Call the application's entry point.*/
bl main

_sidata应该指向哪个内存片段以及它与数据段有何关系?

最佳答案

数据段将位于 RAM 中。由于 RAM 在断电时不会保存其内容,因此必须在启动时从闪存复制数据段的初始值。为此目的,.data 段的初始内容的副本位于 _sidata 标签处;启动代码将其复制到实际数据段中。

关于assembly - 什么是数据段初始值设定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com