• ARM汇编优化


     要做程序的优化,最彻底的方法当然是汇编!还有除了汇编以外(除了二进制)能让你对你的处理器有更全面的控制吗?!对于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
     
  • 相关阅读:
    JVM heap中各generation的大小(Sizing the Generations)
    MySQL中分组取第一条, 以及删除多余的重复记录
    八芯网线水晶头做法(线序)
    Win7命令行下查看无线网络信息
    OpenWrt的开机启动服务(init scripts)
    犀牛书的实例代码:给对象添加freeze, hide, 查询descriptors
    ES6新特性:Javascript中Generator(生成器)
    ES6新特性:Function函数扩展, 扩展到看不懂
    ES6新特性:Javascript中的Map和WeakMap对象
    ES6新特性:Javascript中Set和WeakSet类型的数据结构
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/2422158.html
Copyright © 2020-2023  润新知