c语言变量报存在bss段,C语言初始化——bss段初始化、跃入C、C与汇编

1.bss段初始化

变量

存放位置

初始化的全局变量

数据段

局部变量

malloc函数分配的

未初始的全局变量

bss段

说明:全局变量在未赋初值时,会被保留到bss段。

测试:

#include

int bss_test;

int main()

{

bss_test=;

return ;

}

bss.c

arm-linux-gcc bss.c -o bss

arm-linux-readelf -a bss >bssdump

vim bssdump(看全局变量的地址是否在bss段的起始于结束地址之间)

编写程序清零bss段

clear_bss:

ldr r0,=bss_start

ldr r1,=bss_end

cmp r0,r1

moveq pc,lr

clean_loop:

mov r2,#

str r2,[r0],#

cmp r0,r1

bne clean_loop

mov pc,lr

clear_bss

2.跃入C

点亮led的C程序

#define GPKCON (volatile unsigned long*)0x7f008800

#define GPKDAT (volatile unsigned long*)0x7f008808

int gboot_main()

{

*(GPKCON) = 0x11110000;

*(GPKDAT) = 0xa0;

return ;

}

gboot_main

3.C与汇编混合编程

3.1 汇编调用C函数

把函数名赋予PC指针ldr pc,=gboot_main

3.2 C函数调用汇编

在前面点亮led中light_led函数声明为全局的(汇编中被其他程序引用)

#define GPKCON 0x7f008800

#define GPKDAT 0x7f008808

.global light_led

light_led:

ldr r0, =GPKCON

ldr r1, =0x11110000

str r1, [r0]

ldr r0, =GPKDAT

ldr r1, =0xa0

str r1, [r0]

mov pc, lr

light_led

3.3 C中内嵌汇编

3.3.1 格式

__asm__(

汇编语句部分

:输出部分

:输入部分

:破坏描述部分

);

注:C内嵌汇编以关键字”__asm__”或”asm”开始,下辖四个部分,各部分之间使用":"分开, 第一部分是必须写的,后面三部分是可以省略,但是分号:不能省略

汇编语句部分:汇编语句的集合,可以包含多条汇编语句,每条语句之间需要使用换行符 “\n”隔开或使用分号“ ; ”隔开

输出部分:在汇编中被修改的C变量列表

输入部分: 作为参数输入到汇编中的变量列表

破坏描述部分: 执行汇编指令会破坏的寄存器描述

3.3.2 范例

向cp15 c1寄存器写入数值

void write_p15_c1 (unsigned long value)

{

__asm__(

“mcr p15, , %, c1, c0, \n”

:

: “r” (value) @编译器选择一个R*寄存器(通用寄存器)

: "memory");

}

向cp15 c1寄存器读出数值

unsigned long read_p15_c1 (void)

{

unsigned long value;

__asm__(

“mrc p15, , %, c1, c0, \n”

: “=r” (value) @ ’=‘ 表示只写操作数,用于输出部分

:

: "memory");

return value;

}

3.3.3 优化

unsigned long old;

unsigned long temp;

__asm__ volatile(

"mrs %0, cpsr \n"

"orr %1, %0, #128 \n“

"msr cpsr_c, %\n"

: "=r“ (old), "=r“ (temp)

: :

"memory");

}

使用volatile来告诉编译器,不要对接下来的这部分代码优化

测试

#define GPKCON 0x7f008800

#define GPKDAT 0x7f008808

int gboot_main()

{

//*(GPKCON) = 0X11110000;

//*(GPKDAT) = 0xa0;

__asm__(

"ldr r1, =0x11110000\n"

"str r1, [%0]\n"

"ldr r1, =0xa0\n"

"str r1, [%1]\n"

:

:"r"(GPKCON),"r"(GPKDAT)

:"r1"

);

return ;

}

Part10-C语言环境初始化-Bss段初始化lesson2

1.BSS段的作用 初始化的全局变量存放在数据段: 局部变量存放在栈中: malloc的存放在堆: 未初始化的全局变量存放在BSS段: 找到bss段的起始与结束地址,往里面添加0,便初始化好了. 打开 ...

[国嵌攻略][044][初始化Bss段]

BSS段的作用 1.变量存储的空间 初始化的全局变量:数据段 未初始化的全局变量:BSS段 局部变量:栈 动态分配变量:堆 2.为什么要对BSS段初始化 未初始化的全局变量在使用时才被赋值,未了避免在 ...

bss段为什么要初始化,清除

我们都知道bss段需要初始化,但是这是为什么呢? 通过浏览资料,我们都会发现,bss段是不会出现在程序下载文件(*.bin *.hex)中的,因为全都是0.如果把它们出现在程序下载文件中,会增加程序下 ...

bss段为什么需要初始化?

我们都知道bss段需要初始化,但是这是为什么呢? 通过浏览资料,我们都会发现,bss段是不会出现在程序下载文件(*.bin *.hex)中的,因为全都是0.如果把它们出现在程序下载文件中,会增加程序下 ...

Bss段的作用及初始化

初始化的全局变量:数据段 局部变量:栈 malloc:堆 未初始化的全局变量:Bss段 arm-linux-readelf -a 应用程序    可查看文件运行架构.大小端.共享库等信息 初始化Bss ...

u-boot中bss段的使用

近日在调试uboot时,发现了一个现象,即在relocate_code前如果给未初始化或者初始化值为0的变量赋值的话,则在relocate_code后程序无法正常执行.经过学习,恶补如下知识 BSS段 ...

C语言全局未初始化数据段分析

前言: 在分析C语言全局未初始化变量时,发现在目标文件中全局未初始化变量并不是直接放在bss段中. 再后来发现在两个.c文件中定义同名的全局变量,链接时居然没有发生符号重定义错误.才知道C语言弱定义的 ...

hostapd源代码分析(一):网络接口和BSS的初始化

[转]hostapd源代码分析(一):网络接口和BSS的初始化 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004349 最近在做一 ...

浅谈c语言代码段 数据段 bss段

代码段.数据段.bss段 (1)编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. (2)代码段:代码段就是程序中的可执行部分,直观理解 ...

随机推荐

pureftp 服务

没啥图,不喜勿喷---_-   ftp(file transfer protocol)--文件传输协议 (a)官网:www.pureftpd.org (b)原理 让用户连接上一个远程计算机(运行FTP ...

【ros】rplidar Hector Slam

想用rplidar跑一下hector slam,在网上发现了几个教程写的都不错,但是亲测发现都有点不足,综合了一下,进行补充. 1. 安装ros 和 创建工作空间 http://blog.csdn.n ...

MDX 占比同比环比

http://blog.csdn.net/hero_hegang/article/details/9072889

YII 验证功能

YII 表单的验证可以在module目录下的xxx.php里面定义验证方法,设定需要验证的字段就行 //用户表单验证,在模型里面设置一个方法,具体表单验证规则        public functi ...

Selenium八种基本定位方式---基于python

from selenium import  webdriver driver=webdriver.Firefox() driver.get("https://www.baidu.com&qu ...

position(3rd week blog)

static:静态的默认属性,上(top)下(bottom)左(left)右(right)等参数不会执行没有影响.relative:此属性会根据上(top)下(bottom)左(left)右(righ ...

Exception 和 Error 有什么区别么

声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...

HDU-1002.大数相加(字符串模拟)

本题大意:给出两个1000位以内的大数a 和b,让你计算a + b的值. 本题思路:字符串模拟就能过,会Java的大佬应该不会点进来...... 参考代码: #include

Postman Postman测试接口之JSON结构化数据提交

Postman测试接口之JSON结构化数据提交   by:授客 QQ:1033553122 本文主要是针对结构比较复杂一点的JSON协议数据的提交做个简单说明 举例: 用户下订单接口 接口方向 客户端 ...

ease,seae-in,ease-in-out,ease-out区别

值 描述 linear 规定以相同速度开始至结束的过渡效果(等于 cubic-bezier(0,0,1,1)).(匀速) ease 规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezi ...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值