新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM優(yōu)化之函數(shù)的形參數(shù)量

ARM優(yōu)化之函數(shù)的形參數(shù)量

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
ARM 的參數(shù)傳遞遵循 ATPCS 的規(guī)范,子程序間通過(guò)寄存器 R0-R3 來(lái)傳遞參數(shù),返回值也通過(guò) R0 來(lái)返回。這就造成一個(gè)問(wèn)題,當(dāng)構(gòu)造超過(guò) 4 個(gè)參數(shù)的函數(shù)時(shí),如何實(shí)現(xiàn)。

翻閱了其他資料以及下面的代碼比對(duì)表明,多出來(lái)的參數(shù)傳遞的時(shí)候,需要使用棧,而棧需要使用額外的指令以及對(duì)慢速存儲(chǔ)單元的讀寫(xiě),所以不超過(guò) 4 個(gè)參數(shù)的函數(shù)是很有利于程序的優(yōu)化。

本文引用地址:http://butianyuan.cn/article/201611/316664.htm



測(cè)試代碼如下:



第一段為采用4個(gè)參數(shù)的函數(shù):

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



這段會(huì)編譯成


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個(gè)參數(shù)的函數(shù):

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




而這段又會(huì)編譯成:

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




就上面看來(lái),增加了兩個(gè)參數(shù),就會(huì)增加很多代碼用來(lái)完成這次調(diào)用。但是我們也無(wú)法保證函數(shù)的參數(shù)一定是小于4個(gè)的,所以這里筆者建議,如果函數(shù)的參數(shù)必須要4個(gè)以上的時(shí)候,可以采用結(jié)構(gòu)體的方式來(lái)減少參數(shù)的個(gè)數(shù)。



這樣的優(yōu)化,對(duì)于一些經(jīng)常需要調(diào)用的函數(shù),或者需要快速響應(yīng)的情況下,還是非常必要的。



評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉