您的位置:首页 > 其它

清除bss段

2016-06-03 13:52 190 查看
1、有关链接脚本中的内容:

__bss_start = .;
.bss : { *(.bss) }
__bss_end = .;
 
2、bss段清零C语言实现: 
 
void clear_bss(void)

{

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)

.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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: