首页 » 文档资料 » [] 正文

ARM汇编优化

来源:零零电子  作者:零零电子  时间:2007-07-15 20:47:00  阅读:361
要做程序的优化,最彻底的方法当然是汇编!还有除了汇编以外(除了二进制)能让你对你的处理器有更全面的控制吗?!对于ARM汇编,作为一个初学者,也就只好先补补基础了@_@。
     首先,程序段的定义从AREA 开始,它命名一个代码区域,注意,用非阿拉伯数字作为名字时,应该用|把名字包起来,CODE关键字声明程序(猜测),readonly声明访问权限(猜测)。EXPORT 来表示某个可以用作外部连接的符号(简单点,应该就是函数名?)。END用来结尾。




#eg:



    AREA    |.text|, CODE, READONLY



    EXPORT   square



 
    ; int square(int i)



 
square      ;armcc把不缩进的正文作为一个标号定义



           MUL    r1,r0,r0



           MOV   r0,r1           ;ARM乘法指令有一个限制,就是目标寄存器不能和第一个参数寄存器相同



           MOV   pc,lr            ;对Thumb指令,应该改为BX lr



           END



 
      使用import,可以声明其他文件中定义的标号,要用ARM C库的话,就import |Lib$Request$armlib|, WEAK表示本行的标号如果找不到,不会报告连接错误。如果程序包含主程序main,那么要引入标号__main,代表C库初始化的开始。RN可以让用户给寄存器命名。



#eg:
     AREA            |.text|, CODE,READONLY



 
     EXPORT     main



 
     IMPORT     |Lib$$Request$$armlib|, WEAK



     IMPORT     __main             ;C library entry



     IMPORT     printf                ;prints to stdout



 
i    RN   4



 
        ;int main(void)



main



          STMFD      sp!,{i,lr}



          MOV         i,#0



loop



          ADR          r0,print_string



          MOV         r1,i



          MUL          r2,i,i



          BL            printf



          ADD         i,i,#1



          CMP          i,#10



          BLT          loop



          LDMFD      sp!,{i,pc}



 

print_string



         DCB         " Square of d is d\n", 0



         END




MAP(别名^)和FIELD(别名#),可以在堆栈中为变量和数组定义和分配空间。



 
              MAP     


0                             ;map symbols to offsets 


starting at offset 0?




a            FIELD    4                             ;a is 4 bytes integer(at offset 0)



b            FIELD    2                            ;b is bytes integer(at offset 4)



c            FIELD    64                           ;c is an array of 64 characters (at offset 6)



length     FIELD   0                             ;length records the current offset reached?
 



MACRO用来声明宏:
 



             MACRO
 


            CHECKSUM $ alignment



checksum_$ alignment
 


           LDR         w,[data],#4



l0         ;loop
          


 IF $ alignment<>0




     ADD     sum,sum,w,LSR #8, $alignement
        


       LDR      w,[data],#4
    


           SUBS    N,N,#1
     


          ADD     sum,sum,w,LSL#32-8* $ alignment
 


          ELSE
      


          ADD     sum,sum,w
  

              LDR      w,[data],#4
               SUBS    N,N,#1
    

        ENDIF
    

        BGT         BT l0
    

        MOV         pc,lr
    

        MEND
  


      针对汇编的优化主要是面向硬件的。首先是流水线,有些load指令要需要多个周期来完成,可以通过调整指令的顺序(当然要保证逻辑)来改善性能。另外,尽量让程序只是用寄存器,方法是搞清楚数据占用寄存器的时间关系,实现寄存器有效的分时复用。另外,可以将长度较小的变量合并到一个32位寄存器中保存,以节省寄存器。由于PC可以通过程序操作,对于条件指令,可以直接用PC与形成分支的参数作运算来寻找对应的分支:
      

       ;int switch_relative(int x)
switch_relative
     

        CMP          x,#8
            ADDLT      pc,pc,x,LSL,#2
     

        B              method_d      ;利用流水线,如果PC还是按顺序那么default分支的预取址就不
                                                ;会被冲掉
    

         B              method_0
     

        B              method_1
      
  相关信息
 · 初学2407  2010-03-09 22:12:33
 · 基于TMS320C6701控制多片AD9852的接口电路的设计  2008-09-26 07:49:47
 · 基于MSP430的轨道电路在线测试仪设计与实现  2008-09-07 13:16:26
 · 基于TMS320DM642的图像处理系统  2008-09-05 18:04:24
 · 灵活的MCU架构实现产品的轻松升级  2008-08-29 17:58:57
 · 基于嵌入式Linux的B超图像打印的实现  2008-08-29 17:57:26
 · DSP在自动目标识别中的应用  2008-08-29 17:52:08
 · 中国科技大学再建Xilinx联合实验室!  2008-08-18 15:29:01
 · 实时内核μC/OS-II下的网络监控系统的设计  2008-08-13 05:21:56
 · 基于FPGA的数据无阻塞交换设计  2008-08-11 17:57:55
更多   
    客户服务电话:0551-63525828
    客户服务 QQ:289135388
    MSN:board_00ic@hotmail.com
    传真服务号码:0551-63525828
    地址:合肥市政务区潜山路绿地蓝海国际大厦A楼1609-1610室
关于我们 | 服务条款 | 销售咨询 | 售后服务 | 联系我们 版权所有(C)合肥零零电子科技有限公司 2005-2023 备案管理系统皖ICP备17022914号-1