新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM優化之函數的形參數量

        ARM優化之函數的形參數量

        作者: 時間:2016-11-11 來源:網絡 收藏
        ARM 的參數傳遞遵循 ATPCS 的規范,子程序間通過寄存器 R0-R3 來傳遞參數,返回值也通過 R0 來返回。這就造成一個問題,當構造超過 4 個參數的函數時,如何實現。

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

        本文引用地址:http://www.104case.com/article/201611/316664.htm



        測試代碼如下:



        第一段為采用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個以上的時候,可以采用結構體的方式來減少參數的個數。



        這樣的優化,對于一些經常需要調用的函數,或者需要快速響應的情況下,還是非常必要的。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 长乐市| 黑水县| 余姚市| 宝应县| 浦城县| 当涂县| 施甸县| 信阳市| 锦州市| 玉山县| 甘德县| 邵阳市| 浑源县| 原阳县| 古田县| 通城县| 沐川县| 许昌市| 汝阳县| 大洼县| 合作市| 都匀市| 政和县| 昔阳县| 南木林县| 积石山| 广西| 庆云县| 赤峰市| 昭通市| 巴林右旗| 宁晋县| 龙口市| 连山| 云和县| 桂东县| 东莞市| 潼关县| 庆阳市| 台东县| 天镇县|