栈初始化
为什么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,这样不至于程序中出现为初始化的全局变量为 异常值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?