为什么C语言需要栈
1.概念解析
1.1 栈
(1)栈后进先出
栈顶
SP
栈底
1.2 空/满栈
SP指向的地址已经被占了,是满栈
SP指向的位置是空的,叫空栈
ARM使用的是满栈
1.3 升/降栈
移动的方向来确定是升栈还是降栈
从 低向高 叫升栈
从高到低 叫降栈
ARM 采用降栈
1.4 栈帧(stack frame)
一个进程会用到一个栈
一个函数会分割栈区域的一个地方,这个地方就叫做栈帧
如何来界定栈帧之间的边界
上边界 由 FP指针 R11寄存器
下边界 由 SP指针 R13 寄存器
C语言中 main 函数的上边界 和下边界在哪里呢?
答:被它所调用的函数的 栈帧里面的 SP 和 FP变量
2.栈作用(栈在C语言中的应用)
2.1 保存局部变量
arm-linux-gcc -g stack.c -o stack
arm-linux-objdump -D -S stack > dump
查看 dump文件理解 C语言局部变量
2.2 参数传递
main->func1(1,2,3,4,5,6) 前4个用寄存器保存,后面的用栈保存
2.3 保存寄存器值
main-> func1-> func2
3.栈初始化编程
统一把 SP指针放到 64M位置
2440 是 256M 0x3000000 + 64M = 0x34000000
初始化 bss 段
1.bss段的作用
初始化的全局变量 存放在 数据段
局部变量 /未初始化的局部变量 存储在 栈里面
未初始化的 全局变量 (两个条件必须都满足) 存放在bss段里面
希望从bss段里面的取的值都是0,这样不至于程序中出现为初始化的全局变量为 异常值