Part10-C语言环境初始化-栈初始化lesson1

1、概念解析

ARM系统使用的是满栈!

ARM采用降栈!!!

栈帧

每一个进程会有一个栈,该进程中的每一个函数会分割栈的一部分,那么每一个函数使用的那部分栈就叫做栈帧。那么所有栈帧组成了整个栈。

子函数func里面保存了main函数的上边界FP和下边界SP。

2、栈的作用

保存局部变量

代码样例

编译之:

arm-linux-gcc -g  stack1.c -o stack1

反汇编之:arm-linux-objdump -D -S stack1 >dump

dump里面的结果

首先是push {sp},具体是将str fp,[sp,#-4]!,里面让sp先减4再存。加一个!号,表示使sp-4,但不会对sp本身有影响

add fp,sp,#0把sp加0的值赋值给fp,实际就是把sp赋给fp,让fp也指向栈顶,

sub sp,sp,#12

执行c语言的a++,它是ldr r3,[fp,#-8],从这个地址的内容拿到r3,该地址的内容实际上就是a的值,然后再add r3,r3,#1,加1后再存回原来的地方。

传递参数

在c语言传递参数的过程当中,如果参数的个数小于或等于4的就用r0到r3,如果大于的话就要用栈来传递

保存寄存器的值

3、栈初始化编程

就是对sp指针进行赋值,

6410内存256MB内存位置0x20000000+64MB

210内存512MB内存位置0x50000000+64MB(0x4000000)

2440内存64MB,内存位置0x30000000+64MB

那么我们把sp指针统一指到内存的64MB处(它是向下自减的)

原文地址:https://www.cnblogs.com/gary-guo/p/5795317.html