Chinaunix首页 | 论坛 | 博客
  • 博客访问: 423046
  • 博文数量: 362
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-26 17:08
文章分类

全部博文(362)

文章存档

2015年(362)

我的朋友

分类: 嵌入式

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  //R0R3四个寄存器内容相加

}

[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} 

 //r3r14入栈,这里的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

阅读(719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~