C语言初始化
注意:为什么要进行C语言环境的初始化?
在没有进行C语言环境的初始化之前的初始化工作都是用汇编进行初始化的。
比如核心初始化,和内存初始化
栈:
栈帧:一个进程中一般会有多个函数,每一个函数都需要在内存中开辟一个栈空间来使用,每一个函数所占用栈叫做栈帧。
pc
lr
sp
fp
这四个数据。
栈帧之空间的界定:fp(栈帧指针)指针用于界定最上面的栈界限,用于访问栈中的数据(r11)
sp(栈指针)指针用于界定最下面的栈界限,一般一直指向栈顶(r13)
注意:当一个函数调用另外一个函数时,调用函数栈帧指针相关信息中的fp(栈帧指针)和sp(堆栈指针)保存于被调用函数的栈的顶部
栈的作用:
1:保存局部变量
2:传递参数
3:保存寄存器的值
注意:在arm中,对于函数参数的传递,如果传递参数的个数小于等于4个,就只需要用
r0,r1,r2,r3来传递参数,如果多于4个参数就会用到栈来传递参数
满栈和空栈:
根据SP指向的位置,栈可以分为满栈和空栈
1:满栈(值向的位置有数据)
当堆栈指针sp总是指向最后压入堆栈的数据
2:空栈(指向的位置没有数据)
当堆栈指针sp总是指向下一个将要放入数据的空位置
arm使用是满栈
1:升栈
随着数的入栈,sp指针从低地址变到高地址
2:降栈
随着数据的入栈,sp指针从高地址变道低地址
arm采用降栈
栈对C语言的作用:
(1)保存局部变量
bss段初始化:
一般情况下:
局部变量是存放在:栈
malloc函数中的数据对存放在:堆
位初始化的局部变量是存放在:bss段
一般要求对于BSS中的数据是默认为0 ,对于bss段中的数据的初始化就是将其中的数据预置为零
如何迈进C预言的大门:
找到main()函数的入口地址吗,将这个地址直接赋值给PC
C预言和汇编混合编程:
一:为什么需要C预言和汇编语言的混合编程
1:执行效率
2:能够更直接的控制未处理器,具体意思就是能够直接用汇编指令访问计算集中的某些特殊和重要的寄存器。
二:汇编语言调用C语言函数
调用方式:直接用汇编指令中的跳转指令,跳到C语言main()函数的入口
三:C语言调用汇编语言
对于C语言,汇编语言中的用来定位函数头符标号,相当于C语言中的一个函数。
主意调用的时候需要将汇编语言中调用的代码用.global 伪指令定义该模块为全局型
四:C语言中嵌套编写汇编语言
格式:
_asm_(
汇编语言部分
:输出部分
:输入部分
:破坏描述部分
);
输出部分:执行汇编语句后可能会把C语言中的的一些变量修改了,修改的就放在输出部分
输入部分:执行的汇编语言需要到C语言 中的拿到一些数据做参数,这部分数据就是输入部分
破会描述部分:使用汇编语句时,凡是寄存器中值被修改了,被修改寄存器中都放在破坏描述部分
注意:带分号的几部分,分号后面刻意省略,但是分号不能省略
例子1:
void write_p15_c1(unsigned long value)
{
_asm_(
“mcr p15,0,%0,c1,c0,0\n”
:
:”r”(value)
)
}
分析:
:“r”(value) 输入部分,表示寄存器,具体哪个通用寄存器,系统自己决定,(value)则表示将要读取的值
例子2:
int gboot_main()
#define GPBCOM #0x56000010 @定义宏,将管脚控制寄存器的地址定义成宏(地址查看芯片手册可得)
#define GPBDAT #0X56000014 @定义宏,将管脚数据寄存器的的地址定义成宏(地址查看芯片手册可得){_asm_("ldr r1,=0x15400\n" @将控制字写入到寄存器r1中(根据芯片手手册 卡看控制字,每两位控制一个引脚功能)"str r1,[%0]\n" @控制字写入到控制寄存器中,注意[]中的"%0"表示一 个参数,这个参数来自于输入或输出部分,由输入 和输出部分定义 "ldr r1,=0x6bf\n" @将要写入到 的数据写入到r1中,(每一位控制一个 管脚,具体些什么查看芯片手册) "str r1,[%1]\n" @将数据写回到管脚寄存器中 : @输出部分 :"r"(GPBCOM),"r"(GPBDAT) @输入部分,一般读为输入,写为输出 :"r1" @破坏部分,表示程序在执行过程中影响或修 改到的明确的寄存器)return 0;}注意几点:1:所有的汇编语句都要用双引号扩起来2:注意输入和输出部分是怎么一回事,读取数据一般就是输入,写入数据一般就是输出
C语言初始化的更多相关文章
- go语言初始化结构体指针
go语言初始化结构体指针 head:=&ListNode{} 或者 head:=new(ListNode)
- C语言初始化——bss段初始化、跃入C、C与汇编
1.bss段初始化 变量 存放位置 初始化的全局变量 数据段 局部变量 栈 malloc函数分配的 堆 未初始的全局变量 bss段 说明:全局变量在未赋初值时,会被保留到bss段. 测试: #incl ...
- C语言初始化——栈的初始化
栈是一种具有后进先出性质的数据组织方式,也就是说后存放的先取出,先存放的后取出.栈底是第一个进栈的数据所处的位置,栈顶是最后一个进栈的数据所处的位置. 1.满栈与空栈 根据SP指针指向的位置,栈可以分 ...
- go语言初始化内部结构体3中方式
package main import ( "fmt" ) type User struct { Id int Name string Age int } type Manger ...
- C语言字符串处理
一. C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5';p=&a; //显然是正确的,p="abcd"; ...
- Chrome插件i18n多语言实现
i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.Chrome插件框架中i18n的封装API: chrome.i18n.ge ...
- 在WinForm应用程序中快速实现多语言的处理
在国际化环境下,越来越多的程序需要做多语言版本,以适应各种业务需求的变化.在Winform应用程序中实现多语言也有常规的处理方式处理,不过需要针对每个语言版本,重新修改Winform界面的显示,对一些 ...
- C语言第三周
一. 字符串常量 只要有一对双引号括起来的字符序列就是字符串常量.列如"hello"接"123" 注意:"a"是字符串常量'a'是字符常量. ...
- C++(二十四) — 指向字符的指针为什么可以用字符串来初始化,而不是字符地址?
一.C语言中,为什么字符串可以赋值给字符指针变量? char *p: a='; p=&a; //显然是正确的, p="abcd"; //但为什么也可以这样赋值?? 问:一直 ...
随机推荐
- Python练习-内置函数的应用
说真的,我感觉这几天egon没有睡好,或者是egon心里有事儿,练习给留的太过简单了 # 编辑者:闫龙 # 用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb #name=['al ...
- Python练习-一辆购物车的寂寞都是Alex的错
Alex大神的购物车需求: 商品列表,选择商品后加入购物车,扣款显示余额,如余额不足则提示购买此商品还需充值的金额,退出后自动结账显示余额; # 编辑者:闫龙 #弱鸡购物车程序,需求:定义金额,选择商 ...
- hdu 5463 Clarke and minecraft
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5463 Clarke and minecraft Time Limit: 2000/1000 MS (J ...
- 20155303 实验二 Java面向对象程序设计
20155303 实验二 Java面向对象程序设计 目录 一.单元测试和TDD 任务一:实现百分制成绩转成"优.良.中.及格.不及格"五级制成绩的功能 任务二:以TDD的方式研究学 ...
- marshmallow: 简化Python对象系列化
转载:http://www.thinksaas.cn/topics/0/594/594368.html marshmallow -一个轻量级的库用于将复杂对象转成简单的Python数据类型.或从简单的 ...
- 含有ref out 参数 的方法反射 Emit 与 普通
反射中很多朋友应该屡屡被带有ref out参数的方法折腾 当使用正常反射一个方法时候: 代码如下调用一个后期绑定方法MakeByRefType 就行了 MemberInfo test = typeof ...
- php环境搭建 (window环境下 eclipse+Wampserver)
看了好多的环境搭建感觉好复杂呀,自己搞了一下简单的可以用了 php的手册 http://www.php.net/manual/zh/ 一,下载 1,下载eclipse http://www.ecl ...
- python基础-类的起源
Python中一切事物都是对象. class Foo(object): def __init__(self,name): self.name = name f = Foo("alex&quo ...
- kafka集群及监控部署
1. kafka的定义 kafka是一个分布式消息系统,由linkedin使用scala编写,用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础 ...
- 【[SDOI2009]Bill的挑战】
一看题解好像全是状压DP,那么我就来补充一个容斥写法吧 乍一看,好像是水题,枚举选哪k个串,然后判断 1,如果这k个串中至少两个串某位置确定且不相同,答案显然为02,如果这个位置只被有且仅有一个串确定 ...