Part1 栈初始化
一、满 / 空栈
1.1 满栈: 当堆栈指针SP总是指向最后压入堆栈的数据(ARM采用)
1.2 空栈: 当堆栈指针SP总是指向下一个将要放入数据的空位置
二、升 / 降 栈
根据入栈时,SP指针的移动方向分:若从低——》高 为升栈,从高到低为降栈(ARM使用)
三、栈帧
定义:一个函数所使用的那一部分栈,称为栈帧
栈帧的两个边界 :fp(r11) 、 sp(r13)
三、栈作用
3.1 保存局部变量
3.2 传递参数 :当传递的参数大于4个时,使用栈来传递,否则,用通用寄存器来传递
3.3 传递寄存器的值
Part2 BSS段1初始化
Part3 从汇编跳转到C
跳转方式:绝对跳转
Part4 c与汇编混合编程
一、何处使用汇编:1、效率要求高的地方;2、需要直接操作硬件(如协处理器的操作)
二、汇编中调用C:直接把C的入口指针直接赋值个PC
(C代码在单独的C文件中)
三、C中调用汇编:在汇编文件中将标号声明为.global,然后在C中直接作为函数调用即可。
(汇编代码在单独的文件中)
四、C中内嵌汇编
4.1 、格式
__asm__(
汇编语句部分
:输出部分
:输入部分
:破坏描述部分
);
//例1
void write_p15_c1(unsigned long value)
{
__asm__(
“mcr p15, 0, %0, c1, c0, 0\n” @%0为一个占位参数
:
:”r”(value) @r指明为通用寄存器
);
}
//例2
usigned long read_p15_c1 (void)
{
usigned long value
__asm__(
“mrc p15, 0, %0, c1, c0, 0\n” @c1中读出值送入Value中
:”=r”(value) @’=’表示只写操作数,用于输出部
:
:”memory”
);
return value;
}
4.2 、优化
在编程中,使用volatile来告诉编译器,不要对接下来的这部分代码进行优化(特别是在对硬件进行操作时)