• 流程控制语句反汇编(1)(Debug版)


    // 流程控制语句反汇编
    //Author:乾卦  Date:2014-5-8
    
    #include<stdio.h>
    int main()
    {
        int a=1,b=10;
        if(a>b)
        {
            a=b;
        }
        a=2;
        b=11;
    
        return 0;
    }
    //if语句的反汇编
    #include<stdio.h>
    int main()
    {
    000000013F711010  push        rdi  
    000000013F711012  sub         rsp,10h  
    000000013F711016  mov         rdi,rsp  
    000000013F711019  mov         ecx,4  
    000000013F71101E  mov         eax,0CCCCCCCCh  
    000000013F711023  rep stos    dword ptr [rdi]  
        int a=1,b=10;
    000000013F711025  mov         dword ptr [rsp],1  
    000000013F71102C  mov         dword ptr [b],0Ah  
        if(a>b)
    000000013F711034  mov         eax,dword ptr [b]  
    000000013F711038  cmp         dword ptr [rsp],eax  
                      //如果a<=b 则跳过语句块
    000000013F71103B  jle         main+34h (013F711044h)  
        {
            a=b;
    000000013F71103D  mov         eax,dword ptr [b]  
    000000013F711041  mov         dword ptr [rsp],eax  
        }
        a=2;
    000000013F711044  mov         dword ptr [rsp],2  
        b=11;
    000000013F71104B  mov         dword ptr [b],0Bh  
    
        return 0;
    000000013F711053  xor         eax,eax  
    }
    000000013F711055  add         rsp,10h  
    000000013F711059  pop         rdi  
    000000013F71105A  ret  

    if规定是满足条件则执行if语句块。
    汇编与其相反,是满足条件则跳转,绕过某些代码块,这一点要注意。

    if-else

    // 流程控制语句反汇编
    //Author:乾卦  Date:2014-5-8
    #include<stdio.h>
    int main()
    {
        int a=1,b=10;
        if(a>b)
        {
            a=b;
        }
        else
        {
            b=a;
        }
        a=2;
        b=11;
    
        return 0;
    }
    
    //if-else语句的反汇编
    
    #include<stdio.h>
    int main()
    {
    000000013FF31010  push        rdi  
    000000013FF31012  sub         rsp,10h  
    000000013FF31016  mov         rdi,rsp  
    000000013FF31019  mov         ecx,4  
    000000013FF3101E  mov         eax,0CCCCCCCCh  
    000000013FF31023  rep stos    dword ptr [rdi]  
        int a=1,b=10;
    000000013FF31025  mov         dword ptr [rsp],1  
    000000013FF3102C  mov         dword ptr [b],0Ah  
        if(a>b)
    000000013FF31034  mov         eax,dword ptr [b]  
    000000013FF31038  cmp         dword ptr [rsp],eax  
                      //这是执行else的跳转语句 也是else的执行条件
    000000013FF3103B  jle         main+36h (013FF31046h)  
        {
            a=b;
    000000013FF3103D  mov         eax,dword ptr [b]  
    000000013FF31041  mov         dword ptr [rsp],eax  
        }
        else          //这是执行完if语句块跳转到else后的跳转
    000000013FF31044  jmp         main+3Dh (013FF3104Dh)  
        {
            b=a;
    000000013FF31046  mov         eax,dword ptr [rsp]  
    000000013FF31049  mov         dword ptr [b],eax  
        }
        a=2;
    000000013FF3104D  mov         dword ptr [rsp],2  
        b=11;
    000000013FF31054  mov         dword ptr [b],0Bh  
    
        return 0;
    000000013FF3105C  xor         eax,eax  
    }
    000000013FF3105E  add         rsp,10h  
    000000013FF31062  pop         rdi  
    000000013FF31063  ret  

    if的反汇编仍然没变,但是else有个jmp。

    if-else语句的逻辑:if成功,else就不执行。

    汇编的逻辑:if失败,跳转到else。否则执行if语句块,在else之前跳到if-else语句末尾。

    两者有且只有一个执行。下面来自:《c++反汇编与逆向分析技术揭秘》作者: 钱松林

    if-else if-else:

    // 流程控制语句反汇编
    //Author:乾卦  Date:2014-5-8
    
    #include<stdio.h>
    int main()
    {
        int a=1,b=10;
        if(a>b)
        {
            a=b;
        }
        else if(a==3)
        {
            b=a;
        }
        else if(b<2)
        {
            b=30;
        }
        else
        {
            a=a+b;
        }
        a=2;
        b=11;
    
        return 0;
    }
    //if-else if-else
    #include<stdio.h>
    int main()
    {
    000000013FAD31E0  push        rdi  
    000000013FAD31E2  sub         rsp,10h  
    000000013FAD31E6  mov         rdi,rsp  
    000000013FAD31E9  mov         ecx,4  
    000000013FAD31EE  mov         eax,0CCCCCCCCh  
    000000013FAD31F3  rep stos    dword ptr [rdi]  
        int a=1,b=10;
    000000013FAD31F5  mov         dword ptr [rsp],1  
    000000013FAD31FC  mov         dword ptr [b],0Ah  
        if(a>b)
    000000013FAD3204  mov         eax,dword ptr [b]  
    000000013FAD3208  cmp         dword ptr [rsp],eax  
                      //跳到下一个判断语句
    000000013FAD320B  jle         main+36h (013FAD3216h)  
        {
            a=b;
    000000013FAD320D  mov         eax,dword ptr [b]  
    000000013FAD3211  mov         dword ptr [rsp],eax  
    000000013FAD3214  jmp         main+64h (013FAD3244h)  
        }
        else if(a==3)
    000000013FAD3216  cmp         dword ptr [rsp],3  
    000000013FAD321A  jne         main+45h (013FAD3225h)  
        {
            b=a;
    000000013FAD321C  mov         eax,dword ptr [rsp]  
    000000013FAD321F  mov         dword ptr [b],eax  
    000000013FAD3223  jmp         main+64h (013FAD3244h)  
        }
        else if(b<2)
    000000013FAD3225  cmp         dword ptr [b],2  
    000000013FAD322A  jge         main+56h (013FAD3236h)  
        {
            b=30;
    000000013FAD322C  mov         dword ptr [b],1Eh  
        }
        else
    000000013FAD3234  jmp         main+64h (013FAD3244h)  
        {
            a=a+b;
    000000013FAD3236  mov         eax,dword ptr [b]  
    000000013FAD323A  mov         ecx,dword ptr [rsp]  
    000000013FAD323D  add         ecx,eax  
    000000013FAD323F  mov         eax,ecx  
    000000013FAD3241  mov         dword ptr [rsp],eax  
        }
        a=2;
    000000013FAD3244  mov         dword ptr [rsp],2  
        b=11;
    000000013FAD324B  mov         dword ptr [b],0Bh  
    
        return 0;
    000000013FAD3253  xor         eax,eax  
    }
    000000013FAD3255  add         rsp,10h  
    000000013FAD3259  pop         rdi  
    000000013FAD325A  ret  

    注:红色是一种跳,蓝色是一种跳。

    if与else if都是若条件不满足则跳到下一个判断。最后一个else if则是跳到else语句块。else跟以前一样。

  • 相关阅读:
    [题解?]luogu_P1415拆分数列(dp(不懂
    [题解]luogu_P1070道路游戏(堆dp
    [题解]luogu_P2577午餐(贪心dp
    [题解]luogu_P2157学校食堂(状压dp
    [模板]线段树合并
    [题解]宝藏(状压
    [题解]NOI2010超级钢琴
    [题解]luogu_P2161_会场预约(线段树颜色相关
    【总结】LCA的4种求法
    SRM517-600加强版(DP)
  • 原文地址:https://www.cnblogs.com/qiangua/p/3717691.html
Copyright © 2020-2023  润新知