Chinaunix首页 | 论坛 | 博客
  • 博客访问: 498768
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: 嵌入式

2016-10-01 09:53:26

1、BSS段的作用
初始化的全局变量:数据段
局部变量: 栈
malloc:堆
未初始化的全局变量:bss段

bss.c
  1. #include <stdio.h>

  2. int year;

  3. int main()
  4. {
  5.     year = 2014;
  6.     return year;
  7. }
[root@localhost lesson11_bss]# arm-linux-gcc -c bss.c -o bss
[root@localhost lesson11_bss]# arm-linux-readelf -a bss >dump

  1. 80: 00008410 0 NOTYPE GLOBAL DEFAULT ABS __exidx_end
  2. 81: 00010528 0 OBJECT GLOBAL HIDDEN 22 __dso_handle
  3. 82: 00010530 4 OBJECT GLOBAL DEFAULT 23 year                            10530是year的位置
  4. 83: 00010534 0 NOTYPE GLOBAL DEFAULT ABS __end__
  5. 84: 00008384 116 FUNC GLOBAL DEFAULT 12 __libc_csu_init
  6. 85: 00010534 0 NOTYPE GLOBAL DEFAULT ABS __bss_end__                    结尾是10534
  7. 86: 0001052c 0 NOTYPE GLOBAL DEFAULT ABS __bss_start                    起始是1052c,所以year在bss段中
  8. 87: 00010534 0 NOTYPE GLOBAL DEFAULT ABS _bss_end__

2、未初始化的变量,需要全部清零

  1. clean_bss:
  2.     ldr r0, =bss_start                     bss_start是起始地址,在gboot.lds中获得的
  3.     ldr r1, =bss_end                       bss_end是结束地址,在gboot.lds中获得的
  4.     cmp r0,r1                              比较r0,和r1
  5.     moveq pc,lr                            如果相同就跳转回bl clean_bss

  6. clean_loop:
  7.     mov r2, #0                             设置r2为0
  8.     str r2, [r0], #4                       初始化r0指向的内容,并将r0往下移动一格
  9.     cmp r0,r1                              比较r0,r1
  10.     bne clean_loop                         如果不相同就循环clean_loop
  11.     mov pc,lr                              跳转回bl clean_bss



阅读(1097) | 评论(0) | 转发(0) |
0

上一篇:栈初始化

下一篇:一跃进入C大门

给主人留下些什么吧!~~