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足够使用了

posted @ 2017-06-29 20:58  郁兴力  阅读(359)  评论(0)    收藏  举报