专题10-C语言环境初始化

问题1描述:.在C语言中嵌入汇编,老是报错,感觉和老师都是一样的的代码。但是就是报错说expected  “)”before ;

问题1解决:
_asm_惹的祸,粗心大意所致,一定是__asm__(连续的两条下划线)。才是标识C语言潜逃汇编
1.栈为何物
是一种数据组织形式,具有后进先出的特点。其中栈底是第一个进栈的数据所处的位置。栈顶是最后一个进栈数据所处的位置。
2.满栈:堆栈指针SP总是指向当前最后进栈的数据
空栈:SP总是指向下一个将要存放数据的空位置
3.升栈:(升降都是针对 数据的入栈形式)SP由低地址向高地址移动
降栈:SP由高地址向低地址移动
4.ARM采用满降栈形式
5.栈帧:
一个程序对应一个进程,一个进程对应一个栈空间,然后一个程序对应多个函数,每个函数都会在该栈空间分配到一个完全属于自己的子空间,该子空间就是栈帧。栈帧有边界,上边界是FP(r11),下边界是SP(r13),每一个主调函数的边界都会存放在她的被调函数的栈帧中。
6.栈的作用
(1)保存局部变量
(2)当参数大于四个时候可以传递参数
(3)可以保存寄存器的值
7.代码:

8.BSS段的作用
(1)初始化的全局变量存放在data段
(2)局部变量存放在栈
(3)malloc出的变量存放在堆
(4)未初始化的全局变量存放在BSS段
9.代码(为避免直接使用未初始化的全局变量引起异常,将BSS清0):

10.进入C语言开发(进入BL2)
(1)要用绝对跳转,因为相对跳转只能在同一个代码段进行
(2)210代码搬移的时候,要跳过16B的头部
(3)其实就是一条指令:

然后修改Makefile,在start.s里面添加

11.混合编程
(1)汇编的效率高,直接转换为机器语言,而C要经过转换为汇编
(2)汇编直接控制硬件的寄存器
基于以上原因,有时候必须的用汇编。但大多数场合都是用C,因为编写方便简洁。
(3)汇编调用c函数:
     ldr      pc,=函数名
(4)C调用汇编函数(标号)
先在汇编里声明为全局属性
然后在c里面直接:
               标号名();
12.C内嵌汇编:
(1)格式:
     __asm__(
           汇编语句部分
               :输出部分
               :输入部分
               :破坏描述部分    
     );
(2)以关键字__asm__或者asm开头,后面是(),注意后面不能忘记分号。四个部分都要用到分号
(3)汇编语句部分要用双引号括起来,如果有多条语句,要用换行符‘\n’或者分号隔开,每条指令都要用一个分号括起来。
(4)第一部分不可少,后面三部分可以是空的,但是冒号也不能少。
(5)输出部分是在汇编里要修改的C的变量组成的列表,在分号表示的变量后面用()写入要传回到c里的变量,如:“=r”(var),var就是在c里定义的变量,就是汇编的输出。
(6)输入部分和输入部分类似,只不过他是要将c里面变量的值传递到汇编用。如:“r”(var)。
(7)破坏描述,就是修改部分描述,描述了哪些地方,变量,寄存器被修改了。
(8)优化,在sam后面加上volatile可以避免编译器对代码的优化。在硬件操作中,有时候优化很危险。
(9)实例:


posted @ 2015-04-16 18:49  生活需要深度  阅读(331)  评论(2编辑  收藏  举报