尝试将switch语句的汇编指令转换为c代码

时间:2018-02-11 19:27:34

标签: assembly switch-statement translate

我试图找到此功能的汇编指令的等效c代码。

装配说明:

0x400698: 0x00000000004005ad 0x00000000004005c3  
0x4006a8: 0x00000000004005c3 0x00000000004005c3  
0x4006b8: 0x00000000004005a8 0x00000000004005be  
0x4006c8: 0x00000000004005a8 0x00000000004005b7


   0x000000000040057c <+0>:     push   %rbp
   0x000000000040057d <+1>:     mov    %rsp,%rbp
   0x0000000000400580 <+4>:     mov    %rdi,-0x18(%rbp)
   0x0000000000400584 <+8>:     mov    %rsi,-0x20(%rbp)
   0x0000000000400588 <+12>:    mov    -0x20(%rbp),%rax
   0x000000000040058c <+16>:    mov    %rax,-0x8(%rbp)
   0x0000000000400590 <+20>:    mov    -0x18(%rbp),%rax
   0x0000000000400594 <+24>:    sub    $0x52,%rax
   0x0000000000400598 <+28>:    cmp    $0x7,%rax
   0x000000000040059c <+32>:    ja     0x4005c3 <switch_prob+71>
   0x000000000040059e <+34>:    mov    0x400698(,%rax,8),%rax
   0x00000000004005a6 <+42>:    jmpq   *%rax
   0x00000000004005a8 <+44>:    subq   $0xa,-0x8(%rbp)
   0x00000000004005ad <+49>:    movq   $0x3e,-0x8(%rbp)
   0x00000000004005b5 <+57>:    jmp    0x4005cb <switch_prob+79>
   0x00000000004005b7 <+59>:    sarq   $0x4,-0x8(%rbp)
   0x00000000004005bc <+64>:    jmp    0x4005cb <switch_prob+79>
   0x00000000004005be <+66>:    subq   $0x1,-0x8(%rbp)
   0x00000000004005c3 <+71>:    movq   $0x3b,-0x8(%rbp)
   0x00000000004005cb <+79>:    mov    -0x8(%rbp),%rax
   0x00000000004005cf <+83>:    pop    %rbp
   0x00000000004005d0 <+84>:    retq

我试图在switch语句中恢复案例。我是汇编转换语句的新手。 到目前为止我的代码(猜测最多):

long switch_prob(long x, long n){
    long result = n;
    switch(x){
        case 82:
            break;
        case 7:
            break;
        case 89:
            break;
        case 59:
            break;
        case 87:

        default:
            break;
    }
    return result;
}

1 个答案:

答案 0 :(得分:1)

在$ 82之后,它检查结果是否大于7.如果是,则转到默认情况。否则它会跳过跳转表,因此案例是82 - 89.其中一些案例具有相同的代码,有些案例也属于以下情况。