<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/316664.htm



          測試代碼如下:



          第一段為采用4個參數(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個參數(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




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



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



          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();