记录在开头。如果您发现专业术语有任何错误,请记得及时更正。这真的很重要。1.不传递参数的函数调用本例将实际演示一个只有函数局部变量赋值的demo。它会先看C语言源码和编译后的代码,然后一步步推导出栈的空间。1.1函数源码C语言源码:注:本脚本中main函数调用f函数,每个函数中都有局部变量的定义,函数调用时不传递参数。编译代码:汇编说明:1.2编译步骤过程0.确认栈的地址为了方便记忆和查看,我们先假设栈的实际地址为90001确定main函数的栈帧2.保存局部变量。如果variables<4,直接Save到register。变量数>4的部分被放入堆栈。具体地址参数为3.跳转到f函数。f函数的第一步是压栈。4.确认f函数的栈帧。5.返回参数变量返回的值,会直接放在r0寄存器中。它会开辟一个地址单元,并将地址返回给main函数。6.返回main函数,然后直接返回。通过这个操作,函数返回到主函数和上一个函数。7.返回执行函数可执行文件使用execforksubprocessmain最后一个函数是execve,把execve的地址给pC,下次执行的地址是每个栈帧上一个函数的起始地址,比如9000blb指令会自动将函数的下一个地址压入堆栈。需要改什么,不然编译器会优化掉2.带参数的函数调用2.1运行示例代码对应的汇编代码2.2执行步骤1.将main函数入栈压栈2.存储局部变量3.输入参数入栈4.跳转到f函数5.push将f函数压入栈6.传递参数保存并初始化f函数中的sum值7.给f函数变量赋值。可以发现,此时改变的不是形参n,而是传入的引用栈地址8.加法运算9.返回主函数fp返回上一个函数保存在栈帧中的地址,然后返回到main函数,所以实参的值并没有改变,因为它存储在不同的位置单元中。传递参数并定义局部变量。堆栈或寄存器的不同位置将被保存。3、形参和实参结合上面第二段对形参和实参的分析可以看出,调用函数进行参数传递时,会重新分配栈空间或寄存器。管理。同时,同时被调用的函数(如f函数)在初始化时会先取出寄存器中的值,放入自己的栈中进行管理。所以传入的参数和main函数中传入的参数属于不同的地址。因此它们不会相互影响。100.致敬不知道的请看王老师的精彩讲解在栈管理的学习过程中,我获得了极大的满足感,把之前的一些东西联系到了一起。非常感谢王立涛先生。谢谢你。PS:本文所有资源和图片均来自视频
