i.mx6ull清除BSS段
在汇编语言中,BSS段是存放未初始化全局变量和静态变量的一块内存区域。这些变量在程序开始执行之前会被初始化为零或者默认值。
.global _bss_start
_bss_start:
.word __bss_start
.global _bss_end
_bss_end:
.word __bss_end ldr r0,__bss_start
ldr r1,__bss_end
mov r2,#0
bss_loop:
stmia r0!,{r2}
cmp r0,r1
ble bss_loop
首先,这段代码定义了两个全局符号 _bss_start 和 _bss_end,它们用于标记BSS段的起始地址和结束地址。这些符号是全局可见的,可以在程序的其他部分使用。
- .global 是一个汇编语言的伪指令(pseudo-instruction),用于声明后面定义的符号是全局符号,可以在其他模块中使用。
- __bss_start 和 _bss_start 是两个符号(symbol),用于标记BSS段的起始地址。这里使用了两个符号是因为 _(下划线)是一种常见的命名约定,用于表示全局符号。
- .word 是汇编语言的指令,用于定义一个字(word)大小的数据。在这里,它用于将符号 __bss_start 和 __bss_end的地址存储到相应的内存位置中。
- __bss_end 和 _bss_end 是两个符号,用于标记BSS段的结束地址。
然后,代码开始执行清除BSS段的操作:
- ldr r0, __bss_start:将符号 __bss_start 的地址加载到寄存器 r0 中。
- ldr r1, __bss_end:将符号 __bss_end 的地址加载到寄存器 r1 中。
- mov r2, #0:将寄存器 r2 的值设置为 0,作为清零的值。
- bss_loop:开始一个循环,用于清除BSS段的内容。
- stmia r0!, {r2}:将寄存器 r2 的值存储到 r0 指向的内存地址,并将 r0 自增。
- cmp r0, r1:比较寄存器 r0 和 r1 的值。
- ble bss_loop:如果 r0 小于或等于 r1,则跳转到 bss_loop,继续循环清除 BSS段的内容。
通过循环遍历 BSS 段的每个内存位置,并将其内容设置为 0,这段代码实现了清除 BSS 段的功能。这样,在程序开始执行之前,BSS 段中的全局变量和静态变量将被自动初始化为 0 或默认值。