注意:为什么要进行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语言初始化的更多相关文章

  1. go语言初始化结构体指针

    go语言初始化结构体指针 head:=&ListNode{} 或者 head:=new(ListNode)

  2. C语言初始化——bss段初始化、跃入C、C与汇编

    1.bss段初始化 变量 存放位置 初始化的全局变量 数据段 局部变量 栈 malloc函数分配的 堆 未初始的全局变量 bss段 说明:全局变量在未赋初值时,会被保留到bss段. 测试: #incl ...

  3. C语言初始化——栈的初始化

    栈是一种具有后进先出性质的数据组织方式,也就是说后存放的先取出,先存放的后取出.栈底是第一个进栈的数据所处的位置,栈顶是最后一个进栈的数据所处的位置. 1.满栈与空栈 根据SP指针指向的位置,栈可以分 ...

  4. go语言初始化内部结构体3中方式

    package main import ( "fmt" ) type User struct { Id int Name string Age int } type Manger ...

  5. C语言字符串处理

    一. C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5';p=&a;                     //显然是正确的,p="abcd";   ...

  6. Chrome插件i18n多语言实现

    i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.Chrome插件框架中i18n的封装API: chrome.i18n.ge ...

  7. 在WinForm应用程序中快速实现多语言的处理

    在国际化环境下,越来越多的程序需要做多语言版本,以适应各种业务需求的变化.在Winform应用程序中实现多语言也有常规的处理方式处理,不过需要针对每个语言版本,重新修改Winform界面的显示,对一些 ...

  8. C语言第三周

    一. 字符串常量 只要有一对双引号括起来的字符序列就是字符串常量.列如"hello"接"123" 注意:"a"是字符串常量'a'是字符常量. ...

  9. C++(二十四) — 指向字符的指针为什么可以用字符串来初始化,而不是字符地址?

    一.C语言中,为什么字符串可以赋值给字符指针变量? char *p: a='; p=&a; //显然是正确的, p="abcd"; //但为什么也可以这样赋值?? 问:一直 ...

随机推荐

  1. 公司内网yum源

    新增yum源配置文件 vi /etc/yum.repos.d/szyum.repo 内容如下: #[redhat6.3] [base] name=redhat63 baseurl=http://10. ...

  2. mysql基准测试工具tpcc-mysql安装、使用、结果解读

    TPCC是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业务处理系统,tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品,专用于My ...

  3. aarch64_j2

    js-yui2-2.9.0-10.fc24.noarch.rpm 2016-09-25 07:06 1.2M fedora Mirroring Project js-yui2-jenkins-2.9. ...

  4. Error: No resource found that matches the given name (at 'icon' with value '@mipmap/Icon')

    问题: error: Error: No resource found that matches the given name (at 'icon' with value '@mipmap/Icon' ...

  5. Python之容器类Collections

    容器类Collections 标签(空格分隔): Python进阶 defaultdict counter deque namedtuple defaultdict defaultdict的作用是可以 ...

  6. linux cpu、内存、硬盘空间查询

    [CPU] 算式: CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 #查看CPU型号 cat /proc/cpu ...

  7. 如何从TFS(Visual Studio Team Foundation Server)映射下载本地文件夹

    1.连接tfs项目 首先打开vs2017 ——>工具栏 中的   团队——> 选择团队的管理链接 2.选择管理工作区 显示管理工作区的弹窗,点击 编辑  显示弹窗,选择本地文件夹(即要保存 ...

  8. JVM性能调优监控工具——jps、jstack、jmap、jhat、jstat、hprof使用详解

    摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...

  9. Linux命令之cp命令

    cp命令:用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时,目标 ...

  10. 【Sequel Pro】下载查询结果乱码问题处理方式

    1.下载查询结果已CSV格式保存 2.出现乱码问题样式如下截图: 3. 右键下载的CSV文件,选择用文本编辑打开 4.全选打开的页面内容,重新新建“文本编辑”并进行“储存” 5.打开 1.CSV,则看 ...