c51 语言指针与数组 函数调用,C51中函数调用时参数是怎么传递的?

原标题:C51中函数调用时参数是怎么传递的?

先说一下

首先问一个问题,C51 中函数调用时参数是怎么传递的?

你肯定会说是通过堆栈把实参压栈传递的对吧?

不对哦,8051 单片机内存十分有限,没有软件堆栈,函数调用不通过堆栈来传递形参,而硬件堆栈空间也十分有限,程序里所有的局部变量以及全局变量都是编译的时候固定存储在某个地址的存储空间的,函数调用的时候就不用压栈了,函数的形参通过存储地址或者寄存器来传递,查了一下:

(1) 少于3 个参数的通过寄存器(R0~R7 即系统的硬件堆栈) 传递(寄存器不够时通过存储区传递);

(2) 多于3 个时一部分通过存储区传递;

(3) 重入函数通过堆栈传递(后面会讲)。

既然内存空间十分有限,( 比如用过的方案RAM 是内部256byte+ 外部1280byte/4K) ,那如果程序稍微大一点,变量和函数多一些,能保证所有变量都分配分到地址吗?

为了省内存空间,BL51/LX51 链接器会对用户应用程序进行分析,生成关于函数调用关系的调用树(call tree) ,有些变量的地址是会覆盖的,能覆盖的存储地址遵循下面的原则:

(1)对于有调用关系的函数局部变量地址不会互相覆盖,无调用关系的函数局部变量地址可以复用。

8d95f099ee4b2c0f1f1024a7cfb248f1.png

如上图,箭头表示调用关系,A 指向B 表示A 调用B ,如果实际A 函数调用了B 、D 函数,B 调用了C ,D 调用了C ,那么A 、B 、C 、D 之间是有调用关系的,他们函数内部的局部变量分配的地址不会互相覆盖,E 函数调用F 函数,但E 、F 与A 、B 、C 、D 无调用关系所以E 、F 函数中局部变量地址与A 、B 、C 、D 函数中局部变量地址可以互相复用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值