清除bss段

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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值