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)代码段:代码段就是程序中的可执行部分,直观理解 ...
随机推荐
- ios中tableSection的颜色
ios中tableSection的颜色可以用: @"0xf5f5f5",有个第三方库 #import "UIColor+expanded.h"可以支持十六进制取 ...
- 点击按钮回到页面顶部或者某个高度时的问题,JQUERY
$('#shang').click(function(){ $('html,body').animate({scrollTop: '0px'}, 800); }); 不能写成$(window).ani ...
- BZOJ 4034 BIT & Dfs序
调了恒久突然发现输出优化忘记带负号了.. 就是差分树状数组维护Dfs序即可. #include <iostream> #include <cstring> #include & ...
- TCP 状态机
TCP 状态机 TCP 协议的操作可以使用一个具有 11 种状态的有限状态机( Finite State Machine )来表示,图 3-12 描述了 TCP 的有限状态机,图中的圆角矩形表示状态, ...
- css&js实现顶部banner滚动提示效果
以一个小例子来展示滚动提示的代码部分: try.html <div id="scrollobj" > <span class="scrollTxt&qu ...
- 计算纯文本情况下RichTextBox实际高度的正确方法(.NET)
2016-07-17重大更新 其实有更好.更系统的方法,也是最近才发现的,分享给大家!! /// <summary> /// /// </summary> ...
- Android double输出时保留两位小数
方法1,在代码中操作 this.totalTextview = (TextView) findViewById(R.id.package_total_money); double decimalBal ...
- SpringMVC——form标签的使用
----------------------------------------------------------------------------------- <%@page impor ...
- 怎样创建FTP服务器
怎样创建FTP服务器 2008-05-06 08:42永远的探索|分类:操作系统/系统故障| 浏览6382次 我准备用局域网内的一台机器做FTP服务器,创建FTP服务器一定要用Windows serv ...
- validate
<?php $rules = [ "ip" => function ($var) {return ip2long($var);}, "email" ...