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. 黑马程序员——OC语言 其他语法

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)ARC的判断准则:只要没有强指针指向对象,就会释放对象 1.ARC特 ...

  2. 拿到新机器,进行初始化和部署Nginx的过程

    1. 在/etc/ansbile/hosts中添加主机init 2. 在sysinit.yml中修改要初始化的机器:   hosts: init 3. 设置不检查key      export ANS ...

  3. 2、Linux系统root用户忘记密码的重置方式

    .界面按空格暂停,按E .找到UTF-,在后面空格后输入init=/bin/sh 然后CHRL+X启动 .进入到这个界面,输入mount -o remount,rw / .输入passwd..然后输入 ...

  4. Bootstrap框架基础

    特点:写非常少的代码 即可实现多终端的页面适配 ☑  简单灵活可用于架构流行的用户界面和交互接口的html.css.javascript工具集. ☑  基于html5.css3的bootstrap,具 ...

  5. 【LeetCode OJ】Path Sum II

    Problem Link: http://oj.leetcode.com/problems/path-sum-ii/ The basic idea here is same to that of Pa ...

  6. FatMouse' Trade_贪心

    Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...

  7. C# winform应用程序仅能打开一个进程运行

    判断程序是否已经运行,使程序只能运行一个实例: 方法1: //这种检测进程的名的方法,并不绝对有效.因为打开第一个实例后,将运行文件改名后,还是可以运行第二个实例. private static bo ...

  8. 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    #!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的PEP 0263 -- Defining P ...

  9. Swiper说明&&API手册

    最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎指出,多谢! 翻译自:http://www.idangero.us/sliders/swiper/api.ph ...

  10. Altium Designer 画"差分线"

    Altium Designer 画"差分线" 如何在 Altium Designer 中快速进行差分对走线1:在原理图中让一对网络前缀相同,后缀分别为_N 和_P,并且加上差分队对 ...