分类: 嵌入式
2015-12-10 23:50:27
原文地址:ARM传参分析 作者:
/*********************四参传递C程序***************************/
#include
int show4( int a, int b, int c,int d)
{
return (a+b+c+d);
}
int main(void)
{
int ans4;
ans4=show4(1,2,3,4);
}
/******************四参传递反汇编******************************/
#include
int show4( int a, int b, int c,int d)
{
return (a+b+c+d);
[0xe0800001] add r0,r0,r1
[0xe0800002] add r0,r0,r2
[0xe0800003] add r0,r0,r3 //R0到R3四个寄存器内容相加
}
[0xe1a0f00e] mov pc,r14 //PC返回
int main(void)
{
[0xe52de004] * str r14,[r13,#-4]! //将r14放到堆栈指针下一位,并且SP减去4预留PC指针空间,并非堆栈操作
int ans4;
ans4=show4(1,2,3,4);
[0xe3a03004] mov r3,#4
[0xe3a02003] mov r2,#3
[0xe3a01002] mov r1,#2
[0xe3a00001] mov r0,#1 // 四个参数全部放在寄存器R0-R3中,没有入栈操作
[0xebfffff5] bl show4
}
[0xe3a00000] mov r0,#0
[0xe49df004] ldr pc,[r13],#4 //这里刚好占用预留的位置
/********************************五参传递C程序**************************/
#include
int show5( int a, int b, int c,int d,int e)
{
return (a+b+c+d+e);
}
int main(void)
{
int ans5;
ans5=show5(1,2,3,4,5);
}
/***************************五参传递反汇编*****************************/
#include
int show5( int a, int b, int c,int d,int e)
{
[0xe59dc000] ldr r12,[r13,#0] //这里进行了堆栈参数的传递,之后,R12就是第五个参数的值了
return (a+b+c+d+e);
[0xe0800001] add r0,r0,r1
[0xe0800002] add r0,r0,r2
[0xe0800003] add r0,r0,r3
[0xe080000c] add r0,r0,r12 //同理四参数传递
}
[0xe1a0f00e] mov pc,r14
int main(void)
{
[0xe92d4008] * stmfd r13!,{r3,r14}
//r3,r14入栈,这里的r3入栈是因为后面要用r3入栈传参
int ans5;
ans5=show5(1,2,3,4,5);
[0xe3a03005] mov r3,#5
[0xe58d3000] str r3,[r13,#0]
//第5个参数入栈进行传递
[0xe3a03004] mov r3,#4
[0xe3a02003] mov r2,#3
[0xe3a01002] mov r1,#2
[0xe3a00001] mov r0,#1
//前面四个参数放在寄存器R0-R3中
[0xebfffff1] bl show5
}
[0xe3a00000] mov r0,#0
[0xe8bd8008] ldmfd r13!,{r3,pc}
/**********************************最后结论***************************/
参数个数小于等于4个,编译器用R0--R3来传递参数;多于4个参数时,多出的参数用堆栈来传递参数。OK!