原标题:C51中函数调用时参数是怎么传递的?
先说一下
首先问一个问题,C51 中函数调用时参数是怎么传递的?
你肯定会说是通过堆栈把实参压栈传递的对吧?
不对哦,8051 单片机内存十分有限,没有软件堆栈,函数调用不通过堆栈来传递形参,而硬件堆栈空间也十分有限,程序里所有的局部变量以及全局变量都是编译的时候固定存储在某个地址的存储空间的,函数调用的时候就不用压栈了,函数的形参通过存储地址或者寄存器来传递,查了一下:
(1) 少于3 个参数的通过寄存器(R0~R7 即系统的硬件堆栈) 传递(寄存器不够时通过存储区传递);
(2) 多于3 个时一部分通过存储区传递;
(3) 重入函数通过堆栈传递(后面会讲)。
既然内存空间十分有限,( 比如用过的方案RAM 是内部256byte+ 外部1280byte/4K) ,那如果程序稍微大一点,变量和函数多一些,能保证所有变量都分配分到地址吗?
为了省内存空间,BL51/LX51 链接器会对用户应用程序进行分析,生成关于函数调用关系的调用树(call tree) ,有些变量的地址是会覆盖的,能覆盖的存储地址遵循下面的原则:
(1)对于有调用关系的函数局部变量地址不会互相覆盖,无调用关系的函数局部变量地址可以复用。