单片机
返回首页

ARM优化之函数的形参数量

2016-08-13 来源:eefocus

ARM 的参数传递遵循 ATPCS 的规范,子程序间通过寄存器 R0-R3 来传递参数,返回值也通过 R0 来返回。这就造成一个问题,当构造超过 4 个参数的函数时,如何实现。

翻阅了其他资料以及下面的代码比对表明,多出来的参数传递的时候,需要使用栈,而栈需要使用额外的指令以及对慢速存储单元的读写,所以不超过 4 个参数的函数是很有利于程序的优化。

 
 
测试代码如下:

 
 
第一段为采用4个参数的函数:

 

view plain copy to clipboard print ? 
01.int  Test( void )   
02.{   
03.    return  SubCode (1,2,3,4);   
04.}   
05.    
06.int  SubCode( int  a,  int  b,  int  c,  int  d)   
07.{   
08.    return  a+b+c+d;   
09.}  

 


view plaincopy to clipboardprint?
00.int Test(void)  
00.{  
00.    return SubCode (1,2,3,4);  
00.}  
00.   
00.int SubCode(int a, int b, int c, int d)  
00.{  
00.    return a+b+c+d;  
00.}  
 

 
 
这段会编译成
 


view plain copy to clipboard print ? 
01.Test   
02.MOV   r3,#4   
03.MOV   r2,#3   
04.MOV   r1,#2   
05.MOV   r0,#1   
06.B     SubCode   
07.    
08.SubCode   
09.ADD   r0,r0,r1   
10.ADD   r0,r0,r2   
11.ADD   r0,r0,r3   
12.MOV   pc,lr  

 


view plaincopy to clipboardprint?
00.Test  
00.MOV   r3,#4  
00.MOV   r2,#3  
00.MOV   r1,#2  
00.MOV   r0,#1  
00.B     SubCode  
00.   
00.SubCode  
00.ADD   r0,r0,r1  
00.ADD   r0,r0,r2  
00.ADD   r0,r0,r3  
00.MOV   pc,lr  
 

 
 
 
 
第二段为采用6个参数的函数:

 

 

view plain copy to clipboard print ? 
01.int  Test( void )   
02.{   
03.    return  SubCode (1,2,3,4,5,6);   
04.}   
05.    
06.int  SubCode( int  a,  int  b,  int  c,  int  d,  int  e,  int  f)   
07.{   
08.    return  a+b+c+d+e+f;   
09.}  

 

view plaincopy to clipboardprint?
00.int Test(void)  
00.{  
00.    return SubCode (1,2,3,4,5,6);  
00.}  
00.   
00.int SubCode(int a, int b, int c, int d, int e, int f)  
00.{  
00.    return a+b+c+d+e+f;  
00.} 

 
 
 
而这段又会编译成:

 

 

view plain copy to clipboard print ? 
01.Test   
02.STMFD    sp!,{r2,r3,lr}   
03.MOV      r3,#6   
04.MOV      r2,#5   
05.STMIA    sp,{r2,r3}   
06.MOV      r3,#4   
07.MOV      r2,#3   
08.MOV      r1,#2   
09.MOV      r0,#1   
10.BL       SubCode   
11.LDMFD    sp!,{r2,r3,pc}   
12.    
13.SubCode   
14.STR      lr, [sp,#-4]!   
15.ADD      r0,r0,r1   
16.ADD      r0,r0,r2   
17.ADD      r0,r0,r3   
18.LDMIB    sp,{r12,r14}   
19.ADD      r0,r0,r12   
20.ADD      r0,r0,r14   
21.LDR      pc,{sp},#4  

 

view plaincopy to clipboardprint?
00.Test  
00.STMFD    sp!,{r2,r3,lr}  
00.MOV      r3,#6  
00.MOV      r2,#5  
00.STMIA    sp,{r2,r3}  
00.MOV      r3,#4  
00.MOV      r2,#3  
00.MOV      r1,#2  
00.MOV      r0,#1  
00.BL       SubCode  
00.LDMFD    sp!,{r2,r3,pc}  
00.   
00.SubCode  
00.STR      lr, [sp,#-4]!  
00.ADD      r0,r0,r1  
00.ADD      r0,r0,r2  
00.ADD      r0,r0,r3  
00.LDMIB    sp,{r12,r14}  
00.ADD      r0,r0,r12  
00.ADD      r0,r0,r14  
00.LDR      pc,{sp},#4 

 
 
 
就上面看来,增加了两个参数,就会增加很多代码用来完成这次调用。但是我们也无法保证函数的参数一定是小于4个的,所以这里笔者建议,如果函数的参数必须要4个以上的时候,可以采用结构体的方式来减少参数的个数。

 
 
这样的优化,对于一些经常需要调用的函数,或者需要快速响应的情况下,还是非常必要的。

 
进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 离子检测器电路分析

  • 非常简单的150W功放电路图

  • 基于IC555的可变PWM振荡器电路

  • 使用NE555和磁簧开关的橱柜照明电路

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章