我们每次在编写函数的时候,很多时候都少不了传入参数,也就是函数的形参,少至一个,多至数十个都有可能,那么这些函数的入口参数在进入函数的时候都是在哪里存放着呢?
其实,我也不知道,那就使用仿真器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内部运行是快于栈操作的,所以减少多余的入口参数,可以有效地加快程序运行的速度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)