注意:为什么要进行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. centos6.4下配置nginx服务器更改根目录

    安装完nginx服务器后发现nginx的根目录在/usr/share/nginx/html/下,但是对于部署文件来说,在该目录下是不太习惯的,我就尝试着更改nginx访问的根目录 #  vi /etc ...

  2. Django-Form表单(验证、定制、错误信息、Select)

      Django form 流程 1.创建类,继承form.Form 2.页面根据类的对象自动创建html标签 3.提交,request.POST       封装到类的对象里,obj=UserInf ...

  3. MongoDB警告信息

    更多内容推荐微信公众号,欢迎关注: MongoDB警告信息: 1. WARNING: Using the XFS filesystem is strongly recommended with the ...

  4. HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js

    太久没有更新了,新年回来工作,突然有收到网友的邮件提问,居然还有人在关注,惭愧,找了下电脑上还有一点儿存着,顺便先发这一个番外篇吧,好歹可以看到真实的效果,等我考完英语,一定会更新下一章," ...

  5. Spring4笔记12--SSH整合3--Spring与Struts2整合

    SSH 框架整合技术: 3. Spring与Struts2整合(对比SpringWeb): Spring 与 Struts2 整合的目的有两个: (1)在 Struts2 的 Action 中,即 V ...

  6. ntpdate[35450]: the NTP socket is in use, exiting

    当前主机已是NTP服务器,需关闭当前NTP服务,再同步其他NTP服务器的时间 service ntpd stop 然后ps -ef | grep ntp看进程是否已杀掉 然后再次ntpdate Ser ...

  7. 【bzoj3065】: 带插入区间K小值 详解——替罪羊套函数式线段树

    不得不说,做过最爽的树套树———— 由于有了区间操作,我们很容易把区间看成一棵平衡树,对他进行插入,那么外面一层就是平衡树了,这就与我们之前所见到的不同了.我们之前所见到的大多数是线段树套平衡树而此题 ...

  8. 随机数生成 && 生成执行锁

    生成随机数列: openssl rand -base64 uuidgen echo $RANDOM | md5sum echo $RANDOM | sha256sum 随机小写10个字母 随机数: [ ...

  9. Python爬取微信好友

    前言 今天看到一篇好玩的文章,可以实现微信的内容爬取和聊天机器人的制作,所以尝试着实现一遍,本文记录了实现过程和一些探索的内容 来源: 痴海 链接: https://mp.weixin.qq.com/ ...

  10. error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

    一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.s ...