这个是如何实现的嗯,一切的奥秘就在于有个跳转表。
注意,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;
- }
点击(此处)折叠或打开
- 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