C语言函数参数传递过程

不同的平台或者相同的平台不同的编译选项,参数入栈的方式不一样。

X86平台:函数参数传递使用堆栈来实现,从右向左压栈(_stdcall方式和_cdcel)。【_fastcall方式:左边开始的两个不大于4字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送】

X64平台:前四个参数存放在寄存器中传递,剩余参数则压入堆栈中。

ARM平台:前四个整型参数使用R0,R1,R2,R3传递。多余四个的参数使用下降式堆栈传递。C++中,一个对象方法的第一个参数总是this指针。这个参数是隐式的。因此C++显示参数少于三个,函数执行快。当参数多余4个的时候,可以将其他变量存放在一个结构体中,传递一个结构体指针。

 

参考:https://www.cnblogs.com/jueyunqi/p/4140141.html

编译器一般采用从右到左入栈的原因:

  1. 可以保证参数入栈后相对于栈指针的位置偏移量是固定的,应为参数数量不确定,第一个参数最靠近栈指针,无论参数个数是多少,第一个参数相对于SP的位置是固定的。
  2. 有了1,所以函数可以支持可变长参数的函数。

 

 

 

ARM架构规定:

ATPCS规则体现了一种模块化设计的思想,其基本内容是C模块(函数)
和汇编模块(函数)相互调用的一套规则(C51中也有类似的一套规则)。
我感觉比在线汇编功能强大(不用有很多忌讳),条理更清楚(很简单的几条
规则)
规则内容
一.被调用模块的寄存器使用
   1.调用模块和被调用模块通过R0-R3传递参数,因此参数少于四个时可以随意
     使用剩余的而不必保存和恢复
   2.使用R4-R11之前一定要先在堆栈中保存起来,退出时再恢复
   3.可以使用堆栈,但一定要保证堆栈指针(R13)在进入时和退出时相等
   4.R14用于保存返回地址,使用前一定要备份
二.被调用模块的堆栈使用
   ATPCS规则规定堆栈是满递减(fD)型的,因此使用STMFD/LDMFD指令操作,
   注意保证进入和退出时堆栈指针相等
三.参数传递
   当少于四个时,按从左到右的顺序依次放在r0,r1,r2,r3中;
   当多于四个时,前四个放在r0,r1,r2,r3中,剩余的放在堆栈中,最后一个
   参数先入栈,第五个参数最后入栈,即从右到左入栈
四.返回值
   结果为32位时,通过R0返回
   结果为64位时,r0放低32位,r1放高32位
 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值