1、有关链接脚本中的内容:
__bss_start = .;
.bss : { *(.bss) }
__bss_end = .;
2、bss段清零C语言实现:
void clear_bss(void)
2、bss段清零C语言实现:
{
extern int __bss_start, __bss_end; // 其中“__bss_start”和“__bss_end”表示bss段的首地址和结束地址;
int *p;
for (p= &__bss_start; p < &__bss_end; p++) // 如果“__bss_start”不加取地址符&,则表示bss段的第一个4字节内容;
{
*p = 0x00;
}
}
3、汇编语言中引用bss段的地址:
3.1 方法一(使用ARM伪指令LDR)
ldr r0, =__bss_start
ldr r1, =__bss_end
3.2 方法二(使用ARM指令LDR)
3、汇编语言中引用bss段的地址:
3.1 方法一(使用ARM伪指令LDR)
ldr r0, =__bss_start
ldr r1, =__bss_end
3.2 方法二(使用ARM指令LDR)
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word __bss_end
ldr
r0, _bss_start
ldr
r1, _bss_end
总结:
总结:
1、ARM汇编全局name在C语言中也是以普通C语言全局变量一样使用,要获取这个变量的地址需要用&name获取;
2、ARM汇编中:“ldr r0, name” 读取name标号处的内容,和C语言中直接使用name变量是一致的;
3、ARM汇编中要想获取name处的地址,则要使用伪指令adr、adrl、ldr;
小范围地址读取伪指令: adr r0, label_name
中等范围地址读取伪指令: adrl r0, label_name
大范围地址读取伪指令: ldr r0, = label_name
4、ARM汇编LDR伪指令的语法格式为:LDR {cond} register, =[expr | label-expr]
其中"label-expr“为基于pc的地址表达式或是外部表达式。当label-expr为基于pc的地址表达式时,编译器将label-expr表示的数值放在数据缓冲区(文字池)中,同时用一条基于pc的ldr指令读取该数值。当label-expr为外部表达式,或者非当前段的表达式时,汇编编译器将在目标文件中插入连接重定位伪操作,这样连接器将在连接时生成该地址。
将一个基于pc的地址值或者外部的地址值读取到寄存器中。由于这种地址值是在连接时确定的,所以这种代码不是位置无关的。同时,ldr伪指令处的pc值到数据缓冲区中的目标数据所在的址址的偏量要小于4KB。