打印

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

[复制链接]
5555|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
暖风吹过|  楼主 | 2011-9-1 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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)这种形式,活血初级编程者的不好习惯吧~~~

使用特权

评论回复
5
btiger2000| | 2011-9-1 17:13 | 只看该作者
参数多得时候你可以用指针

使用特权

评论回复
6
原野之狼| | 2011-9-1 21:37 | 只看该作者
首先是可以带N个的
其次为什么要整这么多参数

使用特权

评论回复
7
刘前辈| | 2011-9-2 08:04 | 只看该作者
5楼说得对;带一个参数数组或结构的指针,随便你啦。愿意的话,整个内存都可以是一个参数结构。

使用特权

评论回复
8
暖风吹过|  楼主 | 2011-9-2 08:26 | 只看该作者
谢谢提点!

使用特权

评论回复
9
刘前辈| | 2011-9-2 10:12 | 只看该作者
函数参数编译器可能优先用寄存器,例如C51:首先用R0~R7作参数,那么像
void run(uchar p1,uchar p2,uchar p3,...)  
这样的函数,最好参数限于8个以下,直接寻址存取最快。大于8个就要间接寻址了。——指针寻址就更慢了。


、、

使用特权

评论回复
10
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个就能通过寄存器传递了吗?

使用特权

评论回复
11
rockli| | 2011-9-2 12:00 | 只看该作者
谁说参数大于8个就要间接寻址了?
还有你那意思参数小于8个就能通过寄存器传递了吗?
ayb_ice 发表于 2011-9-2 10:49

是字节,不是个。

使用特权

评论回复
12
刘前辈| | 2011-9-2 12:24 | 只看该作者
本帖最后由 刘前辈 于 2011-9-2 16:46 编辑

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

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

         感谢10楼提醒。

、、

使用特权

评论回复
13
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;

使用特权

评论回复
14
暖风吹过|  楼主 | 2011-9-2 15:05 | 只看该作者
涨知识了! 多谢多谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

40

帖子

1

粉丝