免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3412 | 回复: 14
打印 上一主题 下一主题

[C] 抛砖引玉,咱也说说c语言的函数调用! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-25 23:00 |只看该作者 |倒序浏览
读了Lions'的UNIX源代码分析,对c语言函数调用有点心得,
这里写出来,抛砖引玉,和大家探讨学习。

//C语言的调用
//        1)参数是从右向左入栈的,也就是说
//        左边参数在栈中的位置更接近栈顶。
//        2)栈是由呼叫函数清理的
//        3)对于优化编译,并不是所有的参数都是经过栈传递
//        可能有的参数是通过寄存器传过来的。
//         比如一个两个参数的函数f(int ,int ),被调用的情形,

                        f(a,b):
//压入参数:
                push b
                push a
//调用函数:
                call f
//此时栈中包含有返回地址,也就是下条语句的地址。
//所以栈的布局应该是这样的:
        入栈参数
        返回地址
        保存在栈中的寄存器
        函数中的临时变量。
//(地址从高---〉低)
//这里有一点应注意,对于临时变量是数组的情况,
//如果没有检查边界长度的话,那末过长的输入
//就可能导致返回地址被覆盖,产生缓冲区溢出的问题。
                       
//清理栈  :
                add 8,esp
//备注:如果呼叫函数不是直接清理栈(add 8,esp),而是需要
//获得参数传回的一些信息,比如
                pop c
                pop d
//那 c 就包含函数f结束时函数中参数a的值,d就包含b的值
//对于硬件中断和陷入很有用,因为好些寄存器被入栈传给调用函数,该函数可能要根据不同的情况调整各个寄存器的值,返回的时候这些寄存器被恢复,改过的内容就在里面了。                               
       
//        4)C语言中参数入栈的顺序好处是函数可以是变参数的,
//           因为只要知道第一个参数的地址,那相应的参数(基本类型)地址
//           就可知道,如prinf(char fmt[],...).坏处就是每次调用,
//           呼叫函数都要清理栈,因为只有呼叫函数才知道究竟
//           有多少个参数被入栈,所以这样会轻微增加代码的长度。

论坛徽章:
0
2 [报告]
发表于 2004-02-26 08:24 |只看该作者

抛砖引玉,咱也说说c语言的函数调用!

8错

论坛徽章:
0
3 [报告]
发表于 2004-02-26 09:09 |只看该作者

抛砖引玉,咱也说说c语言的函数调用!

原帖由 "quence" 发表:
读了Lions'的UNIX源代码分析,对c语言函数调用有点心得,
这里写出来,抛砖引玉,和大家探讨学习。


写得不错, 是应该有人说一下这些问题的。支持!

论坛徽章:
0
4 [报告]
发表于 2004-02-26 09:23 |只看该作者

抛砖引玉,咱也说说c语言的函数调用!

我来补充几点。

1、参数传递的次序,方式是由 ABI 决定的。
2、楼主所说的方式是 X86_32 上的典型传递方式。
3、如果一个系统,其 CPU 拥有大量寄存器,那么在设计 ABI 的时候, 通常会考虑通过寄存器来传递参数,返回值。比如:
        3.1 X86_64(AMD64) 有 16 个整数寄存器。当一个函数的参数个数少于7个时, 都是通过寄存器来传递的, 参数多于或等于7个时,部分通过栈来传递。具体的方式为从右到左入栈,剩下最左边6个放进寄存器。
       3.2 PowerPC 750(32bit PPC) 有32个整数寄存器,它采用r3-r10 作为参数传递。

论坛徽章:
0
5 [报告]
发表于 2004-02-26 09:27 |只看该作者

抛砖引玉,咱也说说c语言的函数调用!

原帖由 "win_hate" 发表:
我来补充几点。

1、参数传递的次序,方式是由 ABI 决定的。


ABI是什么呀??????

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2004-02-26 09:27 |只看该作者

抛砖引玉,咱也说说c语言的函数调用!

我记得看过一本书,说是参数不一定是从右向左入栈的。

论坛徽章:
0
7 [报告]
发表于 2004-02-26 09:33 |只看该作者

抛砖引玉,咱也说说c语言的函数调用!

好像听说有些处理器的栈是从低地址往高地址增长的,
或是和内存分开的?
这样就能避免缓冲区溢出的问题(巨大的威胁)。

论坛徽章:
0
8 [报告]
发表于 2004-02-26 09:34 |只看该作者

抛砖引玉,咱也说说c语言的函数调用!

原帖由 "converse" 发表:


ABI是什么呀??????


应用程序二进制接口。

论坛徽章:
0
9 [报告]
发表于 2004-02-26 09:36 |只看该作者

抛砖引玉,咱也说说c语言的函数调用!

原帖由 "quence" 发表:
好像听说有些处理器的栈是从低地址往高地址增长的,
或是和内存分开的?
这样就能避免缓冲区溢出的问题(巨大的威胁)。


听说过, 但不清楚。愿闻其详。

AMD 64 对栈有硬件保护,但目前的 linux 版本不支持。
PPC 的函数返回地址不在堆栈中,避免了部分缓冲区溢出攻击。Intel 的安腾也是如此。

论坛徽章:
0
10 [报告]
发表于 2004-02-26 09:37 |只看该作者

抛砖引玉,咱也说说c语言的函数调用!

[quote]原帖由 "lenovo"]我记得看过一本书,说是参数不一定是从右向左入栈的。[/quote 发表:


应该可以设计成从左到右的,看上去更合理一些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP