为何C语言须要栈linux
1.概念解析编程
1.1 栈函数
(1)栈后进先出指针
栈顶blog
SP进程
栈底变量
1.2 空/满栈gcc
SP指向的地址已经被占了,是满栈gc
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,这样不至于程序中出现为初始化的全局变量为 异常值