关于嵌入式函数入口参数的了解

  我们每次在编写函数的时候,很多时候都少不了传入参数,也就是函数的形参,少至一个,多至数十个都有可能,那么这些函数的入口参数在进入函数的时候都是在哪里存放着呢?
  其实,我也不知道,那就使用仿真器Debug一下看看吧。
  环境准备好:
     - 随便找个IDE即可,MDK/IAR/eclipse等等,只要能进入调试模式就行
     - 随便写段调试代码即可

test1 – 一个参数
void my_add(int a)
{
}

int main(void)
{
	my_add(1);
}

进入函数之前,查看汇编代码:
会将参数1保存到r0寄存器中。
在这里插入图片描述
在这里插入图片描述

test2 – 四个参数
void my_add(int a, int b, int c, int d)
{

}

int main(void)
{
    my_add(1,2,3,4);
}

进入函数之前,查看汇编代码:
会将参数1,参数2,参数3,参数4保存到r0-r3寄存器中。
在这里插入图片描述
在这里插入图片描述

test3 – 五个参数
void my_add(int a, int b, int c, int d, int e)
{

}

int main(void)
{
    my_add(1,2,3,4,5);
}

进入函数之前,查看汇编代码:
会将参数1,参数2,参数3,参数4保存到r0-r3寄存器中,而参数5呢?根据汇编代码, 参数5的值压入当前sp指针位置进行保存,根据下图查看当前sp位置处0x2000B58,在未进入函数前是0x0000000A,而进入函数之后则更新成了参数5的值0x00000005。
在这里插入图片描述
在这里插入图片描述

test4 – 更多参数
此刻自行测试。。。。。。

总结

1、cpu执行代码时,一般用到内部的通用寄存器是R0、R1、R2、R3;
2、当函数的入口参数不超过4个时,则会使用上述4个通用寄存器来保存当前参数;否则,会将多余的参数压入栈中进行保存;
  注意:此处4个参数,指每个参数占用的字节数不超过4个,若参数占用的空间大于4个字节,如结构体或者double类型数据,则会使用多个通用寄存器来保存;
3、最后,也就是一条建议,由于CPU内部运行是快于栈操作的,所以减少多余的入口参数,可以有效地加快程序运行的速度。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值