既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
差不多每个程序员都知道,函数调用过程,就是层层入栈出栈的过程。
那么这个过程中的详细的细节是什么样子的呢?
阅读了以下几篇文章之后,对整个过程基本理解了:
C函数调用过程原理及函数栈帧分析
阅读经典——《深入理解计算机系统》04
函数返回值与栈
针对自己的理解,做个记录:
(一般的操作系统)
- 每个函数都是一个栈结构,有一个栈底指针ebp和栈顶指针esp。栈底指针在函数的执行过程中是不变的,栈顶指针会随着函数的执行动态的增大。
- 在操作系统中,栈底在地址最大的地方,栈是向地址小的方向增长的。所以在栈中,申请空间时,是将栈顶指针esp向下移动,即减去一个大小。
- 函数的层层调用,就形成了连续的栈空间。
- 函数在调用被调用函数时,会将需要传递的参数由从右向左的顺序入栈。被调用函数会根据这个关系去对应的位置取参数。
- 将参数入栈之后,还会将下一条指令的地址入栈。即从被调用函数返回之后,应该执行哪一条指令。
- 跳转至被调用函数。被调用函数需要将当前的栈底指针ebp的值入栈,因为当被调用函数执行完毕之后,需要恢复调用函数的栈空间。并将ebp寄存器的值设为当前函数的栈空间的底部对应的地址,即当前esp的值。
- 被调用函数执行时,根据参数的传入顺序便可以计算出参数相对于ebp指针的位置,从而获取变量的值。
- 被调用函数执行完毕后,如果有返回值,会将返回值存入eax寄存器中。并释放申请的栈空间,恢复ebp和esp的值。从而使被调用函数能够正常执行。
- 将指针寄存器指向调用函数压入栈中的返回地址。
- 调用函数继续执行,如果需要结果,则从eax寄存器中获取
疑问:
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**