ITPub博客

首页 > 应用开发 > > C语言的ARM实现(四)SWITCH

C语言的ARM实现(四)SWITCH

作者:zhjjj 时间:2019-08-28 15:53:59 0 删除 编辑

switch相比if else的实现,其优势是执行效率不会因为分支的增加而变慢。

这个是如何实现的嗯,一切的奥秘就在于有个跳转表。

注意,gcc编译switch时使用跳转表需要分支在4个以上(具体多少个看gcc的实现)int switchtest(int a, int b, int c)

{
    int ret;
    switch(a){
        case 1:
            ret = b+c;
            break;
        case 2:
            ret = b+2*c;
            break;
        case 3:
            ret = b+3*c;
            break;
        case 4:
        case 5:
            ret = b+5*c;
    }
    return ret;
}

arm-linux-gcc -O2 switch.c -S

switchtest:
    @ Function supports interworking.
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    sub    r0, r0, #1   @a-1 ,存入r0
    cmp    r0, #4       @把r0和4比较
    ldrls    pc, [pc, r0, asl #2]  @pc+r0*4,然后执行PC指向的命令,设计非常精巧
    b    .L2
.L7:
    .word    .L9
    .word    .L4
    .word    .L5
    .word    .L6
    .word    .L6
.L6:
    add    r2, r2, r2, asl #2   @r2里面存的是5c,下面会继续执行.L9,即b+5c,这里被优化了
.L9:
    add    r3, r2, r1  @b+c
.L2:
    mov    r0, r3
    bx    lr
.L5:
    add    r2, r2, r2, asl #1 @r2 = r2*2
    add    r3, r2, r1      @r3 = r1+r2, 就是b+3c的意思
    mov    r0, r3
    bx    lr
.L4:
    add    r3, r1, r2, asl #1  @b+2c
    mov    r0, r3
    bx    lr


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/717/viewspace-3134272/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: python
请登录后发表评论 登录
全部评论

注册时间:2019-04-12

  • 博文量
    231
  • 访问量
    1888