色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

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

          本文引用地址:http://cafeforensic.com/article/201611/316664.htm



          測試代碼如下:



          第一段為采用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.}



          這段會編譯成


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




          而這段又會編譯成:

          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




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



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



          評論


          技術(shù)專區(qū)

          關(guān)閉