1.bss段初始化

变量 存放位置
初始化的全局变量 数据段
局部变量
malloc函数分配的
未初始的全局变量 bss段

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

测试:

 #include <stdio.h>

  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 ;
}

C语言初始化——bss段初始化、跃入C、C与汇编的更多相关文章

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

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

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

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

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

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

  4. bss段为什么需要初始化?

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

  5. Bss段的作用及初始化

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

  6. u-boot中bss段的使用

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

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

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

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

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

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

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

随机推荐

  1. 2014年4月份第3周51Aspx源码发布详情

    WPY净水机网站源码  2014-4-14 [VS2008]源码描述: 实现产品展示,在线留言,信息发布,在线咨询,营销网络地图. 网站基本管理:网站banner管理 管理首页滚动图片信息 网站右下部 ...

  2. C语言程序设计第一次作业

    同学们,我们已经留了两次实验了,请大家将这两次的实验课内容写成实验报告在截止日期前进行提交. 截止日期:2016-10-7 23:00 实验一: 编程打印5行的倒三角形,第一行打印9个*,第二行7个* ...

  3. 如何解决xx列不在表中

    在连接数据库的程序中常会出现xx列不在表中的问题?那么应该怎么解决呢? 产生此问题的原因有三种: 1.数据表没这个字段2.sql查询没将这个字段查出来3.字段名写错了 还有重要的是一定要检查你的数据库 ...

  4. 从零开始学习Node.js例子二 文本提交与显示

    index.js var server = require("./server"); var router = require("./router"); var ...

  5. sqlserver查看被锁表、解锁

    查看别锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.d ...

  6. 多个微信菜单都需要获取openId的时候如何处理回调页面的问题

    1.要建立一个特殊的页面处理这个逻辑 if (taskClassId == "6027") { Response.Redirect("./ProductAdvice.as ...

  7. day15_集合第一天

    1.集合体系 红色为今天所学 Collection                          (接口)|--List                       (接口) 元素有序,可以重复 ...

  8. super.onCreate(SavedInstanceState);

    super.onCreate(SavedInatanceState)时调用父类的构造方法,SavedInstanceState是保存当前Activity的状态信息. onCreate方法的参数是Bun ...

  9. jquery 获取浏览器可视窗口大小,滚动条高度

    alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()); //浏览器时下窗口文档的高度 alert($(docum ...

  10. VMD_EI_API=>MAINTAIN_BAPI 去创建供应商主数据

    转自 http://blog.sina.com.cn/s/blog_9ae2f2940102uxyp.html VMD_EI_API=>MAINTAIN_BAPI 去创建供应商主数据的部分数据代 ...