看到21ic以前的帖子有点明白:https://bbs.21ic.com/icview-32548-1-1.html;谢谢db10和flanker,和ayb_ic,computer00,db10说局部变量放在栈里,让我想到我刚看的ARM汇编,ARM用R0,R1,R2,R3传递函数参数(详见ATPCS),参数大于4个入栈。被调用的函数也有变量(或局部变量)要用到R4-R10,此时,要把用的R4-R10入栈,以免被调函数返回时先前的状态被破坏。C语言是有一个一个的函数组成,程序的执行就是不停的执行一个一个的函数。而CPU(或单片机)它的资源是有限的,就R0-R15,CPSR,PC,等等这些寄存器可用。我们在用C的时候,觉得我们可以随意的定义C允许的任何大小任何类型的变量,而C是不能直接被执行的,必须把C的那些语句,变量转换成CPU内部可执行命令,可处理的数据。CPU内部获取保存数据的就那么有限的寄存器,所以任何变量都必须给内存的寄存器。局部变量都是函数的内部变量,随着函数的调用完毕而消失。如果一个函数内部的局部变量数要是一次大于15个(大于内存寄存器的个数)那怎么处理,分时复用??????
CPU内部的寄存器是可以分时复用,但是如果你在函数后面要用到前面的变量怎么吧,所以数据必须保存。在哪???入栈!充分利用RAM的空间。 |