其他分享
首页 > 其他分享> > C语言 --- switch语句的原理(goto版本)

C语言 --- switch语句的原理(goto版本)

作者:互联网

阅读之前:

C语言的switch的代码:

void switch_eg(long x, long n, long *dest)
{
    long val = x;
    switch (n)
    {
    case 100:
        val *= 13;
        break;
    case 102:
        val += 10;
    /* Fall through */
    case 103:
        val += 11;
        break;
    case 104:
    case 106:
        val *= val;
        break;
    default:
        val = 0;
    }
    *dest = val;
}

C语言—将switch语句翻译为扩展的C语言:

void switch_eg_impl(long x, long n, long *dest)
{
    /* Table of code pointers */
    static void *jt[7] = {
        &&loc_A, &&loc_def, &&loc_B,
        &&loc_C, &&loc_D, &&loc_def,
        &&loc_D};
    unsigned long index = n - 100;
    long val;

    if (index > 6)
        goto loc_def;
    /* Multiway branch */
    goto *jt[index];

loc_A: /* Case 100 */
    val = x * 13;
    goto done;
loc_B: /* Case 102 */
    x = x + 10;
/* Fall through */
loc_C: /* Case 103 */
    val = x + 11;
    goto done;
loc_D: /* Cases 104, 106 */
    val = x * x;
    goto done;
loc_def: /* Default case */
    val = 0;
done:
    *dest = val;
}

上面代码用GCC进行运行的结果如图:

在这里插入图片描述

翻译为汇编代码(Part 1):

注:jmp的地址 8*%rsi + .L4

		void switch_eg(long x, long n, long *dest)
		x in %rdi, n in %rsi, dest in %rdx
1 	switch_eg:
2       subq  $100, %rsi               Compute index = n-100
3       cmpq  $6, %rsi                Compare index:6
4       ja    .L8                     If >, goto loc_def
5       jmp   *.L4(,%rsi,8)           Goto *jg[index]
6     .L3:                             loc_A:
7       leaq (%rdi,%rdi,2), %rax        3*x
8       leaq  (%rdi,%rax,4), %rdi      val = 13*x
9       jmp   .L2                        Goto done
10    .L5:                             loc_B:
11      addq  $10, %rdi               x = x + 10
12    .L6:                            loc_C:
13      addq  $11, %rdi               val = x + 11
14      jmp  .L2                       Goto done
15    .L7:                            loc_D:
16      imulq %rdi, %rdi              val = x * x
17      jmp .L2                      Goto done
18    .L8:                           loc_def:
19      movl $0, %edi                 val = 0
20    .L2:                          done:
21      movq %rdi, (%rdx)            *dest = val
22      ret                          Return

汇编代码跳转表部分(Part 2):

1 	.section 	.rodata
2 	.align 			8 Align address to multiple of 8
3  .L4:
4 	.quad .L3 		Case 100: loc_A
5 	.quad .L8 		Case 101: loc_def
6 	.quad .L5 		Case 102: loc_B
7 	.quad .L6 		Case 103: loc_C
8 	.quad .L7 		Case 104: loc_D
9 	.quad .L8 		Case 105: loc_def
10 	.quad .L7 		Case 106: loc_D

标签:Case,loc,goto,val,long,C语言,---,switch,rdi
来源: https://blog.csdn.net/lsllll44/article/details/122104455