带输入参数的函数一般可以带多少个参数

[复制链接]
6759|13
 楼主| 暖风吹过 发表于 2011-9-1 16:56 | 显示全部楼层 |阅读模式
带输入参数的函数一般可以带多少个参数?void run(uchar p1,uchar p2,uchar p3,...)  这样的参数可以带几个?
ayb_ice 发表于 2011-9-1 16:58 | 显示全部楼层
没有限制,多了就怕你自己搞不清楚
 楼主| 暖风吹过 发表于 2011-9-1 17:06 | 显示全部楼层
哦,变量的传递,每个变量都会有自己的存储位置,在函数内部就相当于一个私有变量是吧? 变量应该可以有很多的了哈
 楼主| 暖风吹过 发表于 2011-9-1 17:09 | 显示全部楼层
每个变量都是相同的字母加不同的数字,这样好不好?单片机运行的时候有没有乱套的可能?我用函数的时候都是void run(uchar p1,uchar p2,uchar p3)这种形式,活血初级编程者的不好习惯吧~~~
btiger2000 发表于 2011-9-1 17:13 | 显示全部楼层
参数多得时候你可以用指针
原野之狼 发表于 2011-9-1 21:37 | 显示全部楼层
首先是可以带N个的
其次为什么要整这么多参数
刘前辈 发表于 2011-9-2 08:04 | 显示全部楼层
5楼说得对;带一个参数数组或结构的指针,随便你啦。愿意的话,整个内存都可以是一个参数结构。
 楼主| 暖风吹过 发表于 2011-9-2 08:26 | 显示全部楼层
谢谢提点!
刘前辈 发表于 2011-9-2 10:12 | 显示全部楼层
函数参数编译器可能优先用寄存器,例如C51:首先用R0~R7作参数,那么像
void run(uchar p1,uchar p2,uchar p3,...)  
这样的函数,最好参数限于8个以下,直接寻址存取最快。大于8个就要间接寻址了。——指针寻址就更慢了。


、、
ayb_ice 发表于 2011-9-2 10:49 | 显示全部楼层
函数参数编译器可能优先用寄存器,例如C51:首先用R0~R7作参数,那么像
void run(uchar p1,uchar p2,uchar p3,...)  
这样的函数,最好参数限于8个以下,直接寻址存取最快。大于8个就要间接寻址了。——指针寻址就更 ...
刘前辈 发表于 2011-9-2 10:12

谁说参数大于8个就要间接寻址了?
还有你那意思参数小于8个就能通过寄存器传递了吗?
rockli 发表于 2011-9-2 12:00 | 显示全部楼层
谁说参数大于8个就要间接寻址了?
还有你那意思参数小于8个就能通过寄存器传递了吗?
ayb_ice 发表于 2011-9-2 10:49

是字节,不是个。
刘前辈 发表于 2011-9-2 12:24 | 显示全部楼层
本帖最后由 刘前辈 于 2011-9-2 16:46 编辑

回10楼。9楼说错了,利用R0~R7作参数是寄存器(单字节)寻址,存取速率是最快的。比直接寻址快。

     还有:如果用R0~R7作参数,只能传递3个char 参数,不是8个。分别分配在R7,R5,R3。

         感谢10楼提醒。

、、
suyul 发表于 2011-9-2 12:58 | 显示全部楼层
本帖最后由 suyul 于 2011-9-2 13:00 编辑

严格的说有限制,受到堆栈大小的限制。实际上,如果有1KB的堆栈空间,可以传入256个长整数变量。如果堆栈限制在512B或者256B,则变量个数为128或者64。在变量比较多的时候,建议使用指针和结构体。指针的速度快,不用复制数据到堆栈。汇编代码在函数调用时的伪代码是:
//传值
push v1;v1是第一个参数
push v2;
....
//计算
mov ind, sp ;sp为堆栈指针,ind为间址寄存器
mov ax,(ind);
...
mov ax,res;res为结果,ax为累加器
ret;
 楼主| 暖风吹过 发表于 2011-9-2 15:05 | 显示全部楼层
涨知识了! 多谢多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

40

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部