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)代码段:代码段就是程序中的可执行部分,直观理解 ...
随机推荐
- android 分享或者调用系统或者其他app时 应注意! startActivityForResult() 使用
//判断是否有相应的Activity来接受intentPackageManager packageManager = getPackageManager();List<ResolveInfo&g ...
- jQuery 中 offset()方法与用position()的区别
jq中offset().left和offset().top获取的是相对于整个文档左上角的偏移. 而用$(selector).position().left和.top 取到的则是相对于selector父 ...
- 从零开始学习Node.js例子三 图片上传和显示
index.js var server = require("./server"); var router = require("./router"); var ...
- C#异步批量下载文件
C#异步批量下载文件 实现原理:采用WebClient进行批量下载任务,简单的模拟迅雷下载效果! 废话不多说,先看掩饰效果: 具体实现步骤如下: 1.新建项目:WinBatchDownload 2.先 ...
- Maven管理 划分模块
转载地址:juvenshun.iteye.com/blog/305865 “分天下为三十六郡,郡置守,尉,监” —— <史记·秦始皇本纪> 所有用Maven管理的真实的项目都应该是分模块的 ...
- linux的七种文件类型
d 目录 - 普通文件 l 符号链接 s 套接字文件 b 块设备文件 二进制文件 c 字符设备文件 p 命名管道文件
- Oracle的in/not in(x,...,null)
简述 cola in (x,y,z)等价于 cola=x or cola=y or cola=z cola not in (x,y,z)等价于 !(cola=x or cola=y or cola=z ...
- Solidworks安装界面是英文的解决办法
[问题描述] 一样的安装文件,同事之前安装界面就是中文的,安装好以后软件也是中文的. 这几天系统挂了,重装系统后就发现安装界面是英文的,安装好以后也是英文. win7系统,位数不详,solidwork ...
- DuoCode测试
http://duoco.de/ DuoCode 只能引用自己编译的DLL,不能引用外部DLL.这么做可以保证”代码编得过,就一定能跑“. SharpKit 遇到过这样的问题.在代码中使用了 list ...
- python百分比数比较大小
python是无法识别百分比的,估计你的百分比是string,所以需要转成int # !/usr/bin/python3.4 # -*- coding: utf-8 -*- # 百分数转为int de ...