清除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。
__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。
相关文章推荐
- 关于启用 HTTPS 的一些经验分享
- Paper格式-国际会议版
- Apache处理请求步骤及过程
- Linux下的第一步——进度条(gcc&Makefile)
- find技巧
- 灵活强大的构建系统Gradle
- linux下获取按键响应事件
- RPC failed; result=52, HTTP code = 0(仅供参考)
- 334. Increasing Triplet Subsequence
- 13、python网络编程练习(一)
- autofocus——打开页面,自动获得光标的焦点
- PIC单片机之第一个工程分析,点亮LED
- 格式化时间和金额
- 什么是幻数?
- POJ 1734 Sightseeing trip【floyd求最小环+记录路径】
- 单个和多个checkbox选中事件
- Android Studio 导入第三方库工程、jar 包和 so 库
- 如何解决Android软键盘盖住输入框的问题
- iOS开发iOS7状态栏文字颜色修改
- EF事务