记在最初,若是发现有专业术语的错误,请记得及时改正。 这个真的很重要。
本例会实际演示一个 只有函数局部变量赋值的demo
会先看一下C语言源代码和编译代码,而后一步一步的推演栈的空间使用
C语言源码:html
注释: 这个脚本中,main 函数调用 f 函数,各自函数里面有局部变量的定义,函数调用没有参数传递。segmentfault
编译代码:函数
汇编指令:学习
为了方便记忆和观看,咱们先假设栈的其实地址是 9000优化
若是变量 < 4 个,直接保存到寄存器。spa
变量数量 > 4 的部分放入到栈中。3d
具体的地址参数是视频
f 函数的第一步压栈处理htm
返回的值,会直接放到 r0 寄存器上blog
若是值比较大,会开辟一个地址单元,把地址返回给主函数
而后直接返回
经过这样的操做,函数返回到 main 函数,上一个函数
可执行文件 使用 exec fork 子进程
main的上一个函数 是 execve
把 execve 的地址 给 pC,下一条执行的 地址
每一个栈帧上一个函数的起始地址 好比 9000
bl b 指令自动会函数 下一条地址 压入栈
压栈的都是在下一级须要改变的,要不编译器会优化掉
对应的汇编代码
初始化 sum 值
能够发现此时改变的不是形参 n 而是 传参的栈地址
fp 返回的是栈帧保存的上一个函数的地址
而后从新回到了 main 函数
因此并无改变实际参数的值,由于存储到不一样的位置单元。 传参和定义的局部变量。 会保存栈或者寄存器的不一样位置
结合上面 第二段的内容 形参和实参的分析
能够看出,在调用函数进行参数传递的时候,会从新分配栈空间或者寄存器进行管理。
而同时被调用的函数(好比f函数),在初始化中,会先把寄存器中的值取出来,放到本身的栈里面进行管理。
因此被传入的参数和main函数中的,属于不一样的地址。所以也不会相互影响。
若有不详,请参考王老师的精彩讲解 堆栈管理
学习过程当中,得到了极大的知足感,把以前的一些东西串联了起来。十分感谢 王利涛老师。在此表示感谢。PS:本文中全部的资源和图片均来自视频中