C语言参数传递过程总结

今天午饭时跟同事争论C语言参数传递的问题,同事有ARM开发经验,坚信ARM上的参数传递是通过寄存器的,我在32位x86上面做过实验,也坚信栈传递的方法。

讨论并查了资料后,把学到了点东西记录下来。

32位x86上面,C语言参数传递是压栈出栈的过程,即使加上-O2或者-O3的优化选项,主要原因是32位x86寄存器稀缺的原因。但是如果在编译时加上-mregparm=num选项,参数传递就是用寄存器传递了。但遗憾的是num最大值不能超过3。

以下是man gcc中对-mregparm的解释

       -mregparm=num
           Control how many registers are used to pass integer arguments.  By default, no registers are used to pass arguments, and at most 3
           registers can be used.  You can control this behavior for a specific function by using the function attribute regparm.


           Warning: if you use this switch, and num is nonzero, then you must build all modules with the same value, including any libraries.
           This includes the system libraries and startup modules.

64位x86上面,寄存器的个数比32位多了许多,默认就是用寄存器来参数传递的,谁让人家变得资源丰富了呢。

遗留的问题有:

由哪几个寄存器负责参数传递?

只能传递几个参数,或者几个字节?

64位x86上面能不能关闭寄存器参数传递的功能?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值