Part10-C语言环境初始化——Part10.1-栈初始化
本部分使用汇编来进行编写
在第三节时才可以进入C语言编程环境





每一部分都称为一个栈帧,合起来称为栈。每一部分都通过函数分割。
main函数(任何调用函数的函数)的上边界下边界保存在它调用的函数的栈帧里面,可以看到这里func有一个SP,有一个FP,对应下界和上界

栈的作用:
1、保存局部变量
首先编写stack1
#include<stdio.h>
int main()
{
int a;
a++;
return a;
}
在命令中输入
arm-linux-gcc -g stack1.c -o stack1
arm-linux-objdump -D -S stack1 >dump1
vi dump1
:/main
编译反汇编

首先push命令就是把fp指针保存到sp-4地方(在每行指令后面有一个汇编翻译,这里[sp,#-4]!的感叹号是要把执行的结果赋值给前面的寄存器,也就是sp也会减4,没有感叹号就不会影响sp指针,而只是一个赋值表达式)

第二步把fp也指向这个地方,即stack栈

第三步移动sp
下面是把[fp,#-8]的数值移动到r3,
然后加一,得0x1,存放回原来的位置去
所以我们可以得到这个局部变量A是存在栈中的
fp和sp构成栈两个重要参数
r3是系统存放临时数据的寄存器
2、调用参数

同样编译反汇编

可以看到如果参数个数小于4,那么会用r0,r1,r2,r3来进行传递,如果大于4个,会使用栈来进行传递
会取出来放到r123中进行计算再放到其他地方。
3、保存寄存器的值
#include<stdio.h>
void func2(int a,int b)
{
int k;
k=a+b;
}
void func(int a,int b)
{
int c;
func2(3,4);
c=a+b;
}
int main()
{
func1(1,2);
return 0;
}

因为func1中又调用了func2,所以如果不保存会覆盖掉r2,r3
初始化代码:
init_stack:
ldr sp,=0x54000000 @sp指针指向内存64M位置,0作为栈顶,64M处作为栈底
mov pc,lr @64MB转化为16进制是4000000。0x5000000+4000000
@从64MB地方往下移往下移,基本上64MB足够使用了

浙公网安备 33010602011771号