C语言初始化——bss段初始化、跃入C、C与汇编
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与汇编的更多相关文章
- 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)代码段:代码段就是程序中的可执行部分,直观理解 ...
随机推荐
- java 异常
异常简介 java中有Error和Exception Error:是程序无法处理的错误,表示运行应用程序中较严重问题.大多数错误与代码编写者执行操作无关,而表示运行时JVM出现的问题. Excepti ...
- error: C++ preprocessor "/lib/cpp" fails sanity check
在安装protobuf,知悉./Configure时候报错“error: C++ preprocessor "/lib/cpp" fails sanity check” 下面是转载 ...
- HDU 4717 The Moving Points (三分法)
题意:给n个点的坐标的移动方向及速度,问在之后的时间的所有点的最大距离的最小值是多少. 思路:三分.两点距离是下凹函数,它们的max也是下凹函数.可以三分. #include<iostream& ...
- 安装生物信息学软件-Samtools
装完Bowtie2,官方文档给出的栗子说可以玩一玩samtools,所以我入个坑 参考这篇http://m.010lm.com/roll/2016/0620/2343389.html Step 1: ...
- php大力力 [044节] PHP的POST语句一定要大写!!if(!empty($_POST['id'])) {
早上花了几个小时,寻找错误!!! 不应该这样写 if(!empty($_Post['id'])) { 应该这样写 if(!empty($_POST['id'])) { 万万不能小谢!
- YII2.0 验证表单
控制器代码 <?php namespace app\modules\pub\controllers; use Yii; use backend\base\BaseController; use ...
- Gym 100960G (set+树状数组)
Problem Youngling Tournament 题目大意 给一个序列a[i],每次操作可以更改一个数,每次询问 将序列排序后有多少个数a[i]>=sum[i-1]. n<=10^ ...
- .Net 的一些插件
1)Webmatrix WebMatrix是一个Microsoft提供的免费的Web开发工具,包括你开发网站所需要的一切.从开源Web应用.内置网页模板开始或者完全自己编写代码.它全面而且简单,最重要 ...
- 机器学习(一) 从一个R语言案例学线性回归
写在前面的话 按照正常的顺序,本文应该先讲一些线性回归的基本概念,比如什么叫线性回归,线性回规的常用解法等.但既然本文名为<从一个R语言案例学会线性回归>,那就更重视如何使用R语言去解决线 ...
- 论文笔记之: Person Re-Identification by Multi-Channel Parts-Based CNN with Improved Triplet Loss Function
Person Re-Identification by Multi-Channel Parts-Based CNN with Improved Triplet Loss Function CVPR 2 ...