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"; //但为什么也可以这样赋值?? 问:一直 ...
随机推荐
- 【CC2530强化实训02】普通延时函数实现按键的长按与短按
[CC2530强化实训02]普通延时函数实现按键的长按与短按 [题目要求] 用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法.使用定时器的间隔定时来计算按键按下的时间是通用的做法 ...
- 解决Maven并行编译中出现打包错误问题的思路
解决Maven并行编译中出现打包错误问题的思路 并行构建 Maven 3.x 提供了并行编译的能力,通过执行下列命令就可以利用构建服务器的多线程/多核性能提升构建速度: mvn -T 4 clean ...
- docker制作镜像步骤
一.查看宿主机下是否有符合需求的docker镜像 操作命令如下: [root@server4 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZ ...
- KL散度(Kullback–Leibler divergence)
KL散度是度量两个分布之间差异的函数.在各种变分方法中,都有它的身影. 转自:https://zhuanlan.zhihu.com/p/22464760 一维高斯分布的KL散度 多维高斯分布的KL散度 ...
- SQL 存储过程分页
CREATE PROC p_Team_GetTemaList @pageindex INT , @pagesize INT , @keywords VARCHAR(200) , --模糊查询 名称 标 ...
- Django-自动HTML转义
一.自动HTML转义 从模板生成HTML时,总会有变量包含影响最终HTML的字符风险,例如,考虑这个模板的片段: Hello, {{ name }} 起初,这是一种显示用户名的无害方式,但考虑用户输入 ...
- maxout激活函数
maxout的拟合能力是非常强的,它可以拟合任意的的凸函数.最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合(学过高等数学应该能明白),而maxout又是取k个隐隐含层节点的最大值,这些 ...
- 20165203&20165206结对创意感想
一.结对学习过程 我和我的搭档性格志趣相投,而且各有所长,我们两个均属于一丝不苟的人,做一件事就要把它做好.因此,我们学习理念相同,志趣相投,这可能会占很大的优势.首先,我们会利用一周的前几天看课本, ...
- Knockout应用开发指南 应用举例(简单、高级)
Knockout应用开发指南 第八章:简单应用举例(1)http://www.cnblogs.com/TomXu/archive/2011/11/30/2257067.htmlKnockout应用开发 ...
- Asp.net mvc 实时生成缩率图到硬盘
之前对于缩率图的处理是在图片上传到服务器之后,同步生成两张不同尺寸的缩率供前端调用,刚开始还能满足需求,慢慢的随着前端展示的多样化,缩率图已不能前端展示的需求,所以考虑做一个实时生成图片缩率图服务. ...