码迷,mamicode.com
首页 > 编程语言 > 详细

C++反汇编笔记(五)编译器(VS2013)常用的几个优化技巧(1)

时间:2015-04-07 15:30:32      阅读:377      评论:0      收藏:0      [点我收藏+]

标签:

编译器的工作过程中可以分为几个阶段:预处理-》词法分析-》语法分析-》语义分析-》中间代码生成-》目标代码生成。其中,优化的机会一般存在于中间代码生成或目标代码生成这两个阶段。尤其是在中间代码生成阶段所做的优化,这类优化不具备设备相关性,在不同的硬件环境中都能通用。

debug下,为了调试方便,保持原码与反汇编代码的一一对应,只是进行了很少的优化。

常见的与设备无关的优化方案有以下几种:

1、常量折叠2、常量传播3、减少变量4、剪支优化5、公共表达式6、复写传播7、顺序语句代替分支8、强度削弱9、数学变换10、代码外提

第一格是C++原码,第二格是debug下反汇编代码,第三格是release反汇编下代码,重点看。

代码中的所有输入输出句都是为了防止变量被优化掉,没有其他意义。

 

技术分享
#include <iostream>
using namespace std;
int main()
{
//=======================================常量折叠与常量传播
    int a1;
    a1 = 1 + 1;
    cout << a1 << endl;

//=======================================减少变量
    int x1, y1, m1, n1;
    cin >> m1 >> n1;
    x1 = m1 * 2;
    y1 = n1 * 2;
    if (x1 > y1)
        cout <<"TRUE"<< endl;

//=======================================公共表达式
    int x2, y2, m2;
    cin >> m2 ;
    x2 = m2 * 2;
    y2 = m2 * 2;
    cout << x2 << y2 << endl;
    cin >> x2 >> y2;

//=======================================复写传播
    int x3, y3, a,c;
    cin >> a>>c;
    x3 = a;
    y3 = x3 + c;
    cout << x3 << y3 << endl;
    cin >> x3 >> y3;

//=======================================剪去不可达分支(剪支优化)
    if (1 > 2)
        cout << "TRUE" << endl;

//=======================================顺序语句代替分支
    int a2;
    cin >> a2;
    a2 == 5 ?a2= 6 :a2= 7;
    cout << a2<< endl;

//=======================================强度削弱
    int x4, y4, a3;
    cin >> a3 ;
    x4 = a3*2;
    y4 = a3 / 4;
    cout << x4 << y4;

//=======================================数学变换
    int x5, y5, a4, b4;
    cin >> a4 >> b4;
    x5 = a4 * 1;
    y5 = a4*x5 + b4*x5;
    cout << x5 << y5 << endl;

//=======================================代码外提
    int x6, y6;
    cin >> x6 >> y6;
    while (x6 < y6 / 2)
    {
        cout << x6 << endl;
        x6++;
    }
//===============================================
    system("pause");
    return 0;
}
View Code

 

技术分享
int main()
{
00335E90  push        ebp  
00335E91  mov         ebp,esp  
00335E93  sub         esp,1D0h  
00335E99  push        ebx  
00335E9A  push        esi  
00335E9B  push        edi  
00335E9C  lea         edi,[ebp-1D0h]  
00335EA2  mov         ecx,74h  
00335EA7  mov         eax,0CCCCCCCCh  
00335EAC  rep stos    dword ptr es:[edi]  
00335EAE  mov         eax,dword ptr ds:[00340000h]  
00335EB3  xor         eax,ebp  
00335EB5  mov         dword ptr [ebp-4],eax  
//=======================================常量折叠与常量传播
    int a1;
    a1 = 1 + 1;
00335EB8  mov         dword ptr [a1],2  
    cout << a1 << endl;
00335EBF  mov         esi,esp  
00335EC1  push        3313E8h  
00335EC6  mov         edi,esp  
00335EC8  mov         eax,dword ptr [a1]  
00335ECB  push        eax  
00335ECC  mov         ecx,dword ptr ds:[3410A8h]  
00335ED2  call        dword ptr ds:[341094h]  
00335ED8  cmp         edi,esp  
00335EDA  call        __RTC_CheckEsp (0331339h)  
00335EDF  mov         ecx,eax  
00335EE1  call        dword ptr ds:[341090h]  
00335EE7  cmp         esi,esp  
00335EE9  call        __RTC_CheckEsp (0331339h)  

//=======================================减少变量
    int x1, y1, m1, n1;
    cin >> m1 >> n1;
00335EEE  mov         esi,esp  
00335EF0  lea         eax,[n1]  
00335EF3  push        eax  
00335EF4  mov         edi,esp  
00335EF6  lea         ecx,[m1]  
00335EF9  push        ecx  
00335EFA  mov         ecx,dword ptr ds:[3410A4h]  
00335F00  call        dword ptr ds:[341100h]  
00335F06  cmp         edi,esp  

//=======================================减少变量
    int x1, y1, m1, n1;
    cin >> m1 >> n1;
00335F08  call        __RTC_CheckEsp (0331339h)  
00335F0D  mov         ecx,eax  
00335F0F  call        dword ptr ds:[341100h]  
00335F15  cmp         esi,esp  
00335F17  call        __RTC_CheckEsp (0331339h)  
    x1 = m1 * 2;
00335F1C  mov         eax,dword ptr [m1]  
00335F1F  shl         eax,1  
00335F21  mov         dword ptr [x1],eax  
    y1 = n1 * 2;
00335F24  mov         eax,dword ptr [n1]  
00335F27  shl         eax,1  
00335F29  mov         dword ptr [y1],eax  
    if (x1 > y1)
00335F2C  mov         eax,dword ptr [x1]  
00335F2F  cmp         eax,dword ptr [y1]  
00335F32  jle         main+0CDh (0335F5Dh)  
        cout <<"TRUE"<< endl;
00335F34  mov         esi,esp  
00335F36  push        3313E8h  
00335F3B  push        33DC70h  
00335F40  mov         eax,dword ptr ds:[003410A8h]  
00335F45  push        eax  
00335F46  call        std::operator<<<std::char_traits<char> > (03312B2h)  
00335F4B  add         esp,8  
00335F4E  mov         ecx,eax  
00335F50  call        dword ptr ds:[341090h]  
00335F56  cmp         esi,esp  
00335F58  call        __RTC_CheckEsp (0331339h)  

//=======================================公共表达式
    int x2, y2, m2;
    cin >> m2 ;
00335F5D  mov         esi,esp  
00335F5F  lea         eax,[m2]  
00335F62  push        eax  
00335F63  mov         ecx,dword ptr ds:[3410A4h]  
00335F69  call        dword ptr ds:[341100h]  
00335F6F  cmp         esi,esp  
00335F71  call        __RTC_CheckEsp (0331339h)  
    x2 = m2 * 2;
00335F76  mov         eax,dword ptr [m2]  
00335F79  shl         eax,1  
00335F7B  mov         dword ptr [x2],eax  
    y2 = m2 * 2;
00335F7E  mov         eax,dword ptr [m2]  
00335F81  shl         eax,1  
00335F83  mov         dword ptr [y2],eax  
    cout << x2 << y2 << endl;
00335F86  mov         esi,esp  
00335F88  push        3313E8h  
00335F8D  mov         edi,esp  
00335F8F  mov         eax,dword ptr [y2]  
00335F92  push        eax  
00335F93  mov         ebx,esp  
00335F95  mov         ecx,dword ptr [x2]  
00335F98  push        ecx  
00335F99  mov         ecx,dword ptr ds:[3410A8h]  
00335F9F  call        dword ptr ds:[341094h]  
00335FA5  cmp         ebx,esp  
00335FA7  call        __RTC_CheckEsp (0331339h)  
00335FAC  mov         ecx,eax  
00335FAE  call        dword ptr ds:[341094h]  
00335FB4  cmp         edi,esp  
00335FB6  call        __RTC_CheckEsp (0331339h)  
00335FBB  mov         ecx,eax  
00335FBD  call        dword ptr ds:[341090h]  
00335FC3  cmp         esi,esp  
00335FC5  call        __RTC_CheckEsp (0331339h)  
    cin >> x2 >> y2;
00335FCA  mov         esi,esp  
00335FCC  lea         eax,[y2]  
00335FCF  push        eax  
00335FD0  mov         edi,esp  
00335FD2  lea         ecx,[x2]  
00335FD5  push        ecx  
00335FD6  mov         ecx,dword ptr ds:[3410A4h]  
00335FDC  call        dword ptr ds:[341100h]  
00335FE2  cmp         edi,esp  
00335FE4  call        __RTC_CheckEsp (0331339h)  
00335FE9  mov         ecx,eax  
00335FEB  call        dword ptr ds:[341100h]  
00335FF1  cmp         esi,esp  
00335FF3  call        __RTC_CheckEsp (0331339h)  

//=======================================复写传播
    int x3, y3, a,c;
    cin >> a>>c;
00335FF8  mov         esi,esp  
00335FFA  lea         eax,[c]  
00336000  push        eax  
00336001  mov         edi,esp  
00336003  lea         ecx,[a]  
00336009  push        ecx  
0033600A  mov         ecx,dword ptr ds:[3410A4h]  
00336010  call        dword ptr ds:[341100h]  
00336016  cmp         edi,esp  
00336018  call        __RTC_CheckEsp (0331339h)  
0033601D  mov         ecx,eax  
0033601F  call        dword ptr ds:[341100h]  
00336025  cmp         esi,esp  
00336027  call        __RTC_CheckEsp (0331339h)  
    x3 = a;
0033602C  mov         eax,dword ptr [a]  
00336032  mov         dword ptr [x3],eax  
    y3 = x3 + c;
00336035  mov         eax,dword ptr [x3]  
00336038  add         eax,dword ptr [c]  
0033603E  mov         dword ptr [y3],eax  
    cout << x3 << y3 << endl;
00336041  mov         esi,esp  
00336043  push        3313E8h  
00336048  mov         edi,esp  
0033604A  mov         eax,dword ptr [y3]  
0033604D  push        eax  
0033604E  mov         ebx,esp  
00336050  mov         ecx,dword ptr [x3]  
00336053  push        ecx  
00336054  mov         ecx,dword ptr ds:[3410A8h]  
0033605A  call        dword ptr ds:[341094h]  
00336060  cmp         ebx,esp  
00336062  call        __RTC_CheckEsp (0331339h)  
00336067  mov         ecx,eax  
00336069  call        dword ptr ds:[341094h]  
0033606F  cmp         edi,esp  
00336071  call        __RTC_CheckEsp (0331339h)  
00336076  mov         ecx,eax  
00336078  call        dword ptr ds:[341090h]  
0033607E  cmp         esi,esp  
00336080  call        __RTC_CheckEsp (0331339h)  
    cin >> x3 >> y3;
00336085  mov         esi,esp  
00336087  lea         eax,[y3]  
0033608A  push        eax  
0033608B  mov         edi,esp  
0033608D  lea         ecx,[x3]  
00336090  push        ecx  
00336091  mov         ecx,dword ptr ds:[3410A4h]  
00336097  call        dword ptr ds:[341100h]  
0033609D  cmp         edi,esp  
0033609F  call        __RTC_CheckEsp (0331339h)  
003360A4  mov         ecx,eax  
003360A6  call        dword ptr ds:[341100h]  
003360AC  cmp         esi,esp  
003360AE  call        __RTC_CheckEsp (0331339h)  

//=======================================剪去不可达分支(剪支优化)
    if (1 > 2)
003360B3  xor         eax,eax  
003360B5  je          main+250h (03360E0h)  
        cout << "TRUE" << endl;
003360B7  mov         esi,esp  
003360B9  push        3313E8h  
003360BE  push        33DC70h  
003360C3  mov         eax,dword ptr ds:[003410A8h]  
003360C8  push        eax  
003360C9  call        std::operator<<<std::char_traits<char> > (03312B2h)  
003360CE  add         esp,8  
003360D1  mov         ecx,eax  
003360D3  call        dword ptr ds:[341090h]  
003360D9  cmp         esi,esp  
003360DB  call        __RTC_CheckEsp (0331339h)  

//=======================================顺序语句代替分支
    int a2;
    cin >> a2;
003360E0  mov         esi,esp  
003360E2  lea         eax,[a2]  
003360E8  push        eax  
003360E9  mov         ecx,dword ptr ds:[3410A4h]  
003360EF  call        dword ptr ds:[341100h]  
003360F5  cmp         esi,esp  
003360F7  call        __RTC_CheckEsp (0331339h)  
    a2 == 5 ?a2= 6 :a2= 7;
003360FC  cmp         dword ptr [a2],5  
00336103  jne         main+28Dh (033611Dh)  
00336105  mov         dword ptr [a2],6  
0033610F  mov         eax,dword ptr [a2]  
00336115  mov         dword ptr [ebp-1D0h],eax  
0033611B  jmp         main+2A3h (0336133h)  
0033611D  mov         dword ptr [a2],7  
00336127  mov         ecx,dword ptr [a2]  
0033612D  mov         dword ptr [ebp-1D0h],ecx  
    cout << a2<< endl;
00336133  mov         esi,esp  
00336135  push        3313E8h  
0033613A  mov         edi,esp  
0033613C  mov         eax,dword ptr [a2]  
00336142  push        eax  
00336143  mov         ecx,dword ptr ds:[3410A8h]  
00336149  call        dword ptr ds:[341094h]  
0033614F  cmp         edi,esp  
00336151  call        __RTC_CheckEsp (0331339h)  
00336156  mov         ecx,eax  
00336158  call        dword ptr ds:[341090h]  
0033615E  cmp         esi,esp  
00336160  call        __RTC_CheckEsp (0331339h)  

//=======================================强度削弱
    int x4, y4, a3;
    cin >> a3 ;
00336165  mov         esi,esp  
00336167  lea         eax,[a3]  
0033616D  push        eax  
0033616E  mov         ecx,dword ptr ds:[3410A4h]  
00336174  call        dword ptr ds:[341100h]  
0033617A  cmp         esi,esp  
0033617C  call        __RTC_CheckEsp (0331339h)  
    x4 = a3*2;
00336181  mov         eax,dword ptr [a3]  
00336187  shl         eax,1  
00336189  mov         dword ptr [x4],eax  
    y4 = a3 / 4;
0033618F  mov         eax,dword ptr [a3]  
00336195  cdq  
00336196  and         edx,3  
00336199  add         eax,edx  
0033619B  sar         eax,2  
0033619E  mov         dword ptr [y4],eax  
    cout << x4 << y4;
003361A4  mov         esi,esp  
003361A6  mov         eax,dword ptr [y4]  
003361AC  push        eax  
003361AD  mov         edi,esp  
003361AF  mov         ecx,dword ptr [x4]  
003361B5  push        ecx  
003361B6  mov         ecx,dword ptr ds:[3410A8h]  
003361BC  call        dword ptr ds:[341094h]  
003361C2  cmp         edi,esp  
003361C4  call        __RTC_CheckEsp (0331339h)  
003361C9  mov         ecx,eax  
003361CB  call        dword ptr ds:[341094h]  
003361D1  cmp         esi,esp  
003361D3  call        __RTC_CheckEsp (0331339h)  

//=======================================数学变换
    int x5, y5, a4, b4;
    cin >> a4 >> b4;
003361D8  mov         esi,esp  
003361DA  lea         eax,[b4]  
003361E0  push        eax  
003361E1  mov         edi,esp  
003361E3  lea         ecx,[a4]  
003361E9  push        ecx  
003361EA  mov         ecx,dword ptr ds:[3410A4h]  
003361F0  call        dword ptr ds:[341100h]  
003361F6  cmp         edi,esp  
003361F8  call        __RTC_CheckEsp (0331339h)  
003361FD  mov         ecx,eax  
003361FF  call        dword ptr ds:[341100h]  
00336205  cmp         esi,esp  
00336207  call        __RTC_CheckEsp (0331339h)  
    x5 = a4 * 1;
0033620C  mov         eax,dword ptr [a4]  
00336212  mov         dword ptr [x5],eax  
    y5 = a4*x5 + b4*x5;
00336218  mov         eax,dword ptr [a4]  
0033621E  imul        eax,dword ptr [x5]  
00336225  mov         ecx,dword ptr [b4]  
0033622B  imul        ecx,dword ptr [x5]  
00336232  add         eax,ecx  
00336234  mov         dword ptr [y5],eax  
    cout << x5 << y5 << endl;
0033623A  mov         esi,esp  
0033623C  push        3313E8h  
00336241  mov         edi,esp  
00336243  mov         eax,dword ptr [y5]  
00336249  push        eax  
0033624A  mov         ebx,esp  
0033624C  mov         ecx,dword ptr [x5]  
00336252  push        ecx  
00336253  mov         ecx,dword ptr ds:[3410A8h]  
00336259  call        dword ptr ds:[341094h]  
0033625F  cmp         ebx,esp  
00336261  call        __RTC_CheckEsp (0331339h)  
00336266  mov         ecx,eax  
00336268  call        dword ptr ds:[341094h]  
0033626E  cmp         edi,esp  
00336270  call        __RTC_CheckEsp (0331339h)  
00336275  mov         ecx,eax  
00336277  call        dword ptr ds:[341090h]  
0033627D  cmp         esi,esp  
0033627F  call        __RTC_CheckEsp (0331339h)  

//=======================================代码外提
    int x6, y6;
    cin >> x6 >> y6;
00336284  mov         esi,esp  
00336286  lea         eax,[y6]  
0033628C  push        eax  
0033628D  mov         edi,esp  
0033628F  lea         ecx,[x6]  
00336295  push        ecx  
00336296  mov         ecx,dword ptr ds:[3410A4h]  
0033629C  call        dword ptr ds:[341100h]  
003362A2  cmp         edi,esp  
003362A4  call        __RTC_CheckEsp (0331339h)  
003362A9  mov         ecx,eax  
003362AB  call        dword ptr ds:[341100h]  
003362B1  cmp         esi,esp  
003362B3  call        __RTC_CheckEsp (0331339h)  
    while (x6 < y6 / 2)
003362B8  mov         eax,dword ptr [y6]  
003362BE  cdq  
003362BF  sub         eax,edx  
003362C1  sar         eax,1  
003362C3  cmp         dword ptr [x6],eax  
003362C9  jge         main+47Eh (033630Eh)  
    {
        cout << x6 << endl;
003362CB  mov         esi,esp  
003362CD  push        3313E8h  
003362D2  mov         edi,esp  
003362D4  mov         eax,dword ptr [x6]  
003362DA  push        eax  
003362DB  mov         ecx,dword ptr ds:[3410A8h]  
003362E1  call        dword ptr ds:[341094h]  
003362E7  cmp         edi,esp  
003362E9  call        __RTC_CheckEsp (0331339h)  
003362EE  mov         ecx,eax  
003362F0  call        dword ptr ds:[341090h]  
003362F6  cmp         esi,esp  
003362F8  call        __RTC_CheckEsp (0331339h)  
        x6++;
003362FD  mov         eax,dword ptr [x6]  
00336303  add         eax,1  
00336306  mov         dword ptr [x6],eax  
    }
0033630C  jmp         main+428h (03362B8h)  
//===============================================
    system("pause");
0033630E  mov         esi,esp  
00336310  push        33DC78h  
00336315  call        dword ptr ds:[3411DCh]  
0033631B  add         esp,4  
0033631E  cmp         esi,esp  
00336320  call        __RTC_CheckEsp (0331339h)  
    return 0;
00336325  xor         eax,eax  
}
View Code

 

技术分享
{
001E12A0  push        ebp  
001E12A1  mov         ebp,esp  
001E12A3  sub         esp,40h  
001E12A6  mov         eax,dword ptr ds:[001E4000h]  
001E12AB  xor         eax,ebp  
001E12AD  mov         dword ptr [ebp-4],eax  
//=======================================常量折叠与常量传播
    int a1;
    a1 = 1 + 1;
    cout << a1 << endl;
001E12B0  mov         ecx,dword ptr ds:[1E305Ch]  
//=======================================常量折叠与常量传播
    int a1;
    a1 = 1 + 1;
    cout << a1 << endl;
//1是常量,1+1必然是2,结果可以预见,所以直接生成a1=3(常量折叠);
//而其后cout<<a1,a1的值已经确定,所以直接由a1的常量值代替a1(常量传播)。
001E12B6  push        1E1990h  
001E12BB  push        2  
001E12BD  call        dword ptr ds:[1E3064h]  
001E12C3  mov         ecx,eax  
001E12C5  call        dword ptr ds:[1E3040h]  

//=======================================减少变量
    int x1, y1, m1, n1;
    cin >> m1 >> n1;
001E12CB  mov         ecx,dword ptr ds:[1E3058h]  
001E12D1  lea         eax,[n1]  
001E12D4  push        eax  
001E12D5  lea         eax,[m1]  
001E12D8  push        eax  
001E12D9  call        dword ptr ds:[1E3038h]  
001E12DF  mov         ecx,eax  
001E12E1  call        dword ptr ds:[1E3038h]  
    x1 = m1 * 2;
    y1 = n1 * 2;
001E12E7  mov         eax,dword ptr [n1]  
001E12EA  lea         ecx,[eax+eax]  
001E12ED  mov         eax,dword ptr [m1]  
001E12F0  add         eax,eax  
    if (x1 > y1)
//这里x1>y1等于m1>n1的比较,所以优化掉了x1和y1,直接比较是的
//m1*2和n1*2的值
001E12F2  cmp         eax,ecx  
001E12F4  jle         main+6Eh (01E130Eh)  
        cout <<"TRUE"<< endl;
001E12F6  mov         ecx,dword ptr ds:[1E305Ch]  
001E12FC  push        1E1990h  
001E1301  call        std::operator<<<std::char_traits<char> > (01E19C0h)  
001E1306  mov         ecx,eax  
001E1308  call        dword ptr ds:[1E3040h]  

//=======================================公共表达式
    int x2, y2, m2;
    cin >> m2 ;
001E130E  mov         ecx,dword ptr ds:[1E3058h]  
001E1314  lea         eax,[m2]  
001E1317  push        eax  
001E1318  call        dword ptr ds:[1E3038h]  
    x2 = m2 * 2;
001E131E  mov         eax,dword ptr [m2]  
    y2 = m2 * 2;
    cout << x2 << y2 << endl;
001E1321  mov         ecx,dword ptr ds:[1E305Ch]  
    y2 = m2 * 2;
    cout << x2 << y2 << endl;
//m2*2是x2和y2的公共表达式,所以计算出m2*2的值后,
//直接赋值给x2和y2
001E1327  add         eax,eax  
001E1329  push        1E1990h  
001E132E  push        eax  
001E132F  push        eax  
001E1330  mov         dword ptr [x2],eax  
001E1333  mov         dword ptr [y2],eax  
001E1336  call        dword ptr ds:[1E3064h]  
001E133C  mov         ecx,eax  
001E133E  call        dword ptr ds:[1E3064h]  
001E1344  mov         ecx,eax  
001E1346  call        dword ptr ds:[1E3040h]  
    cin >> x2 >> y2;
001E134C  mov         ecx,dword ptr ds:[1E3058h]  
001E1352  lea         eax,[y2]  
001E1355  push        eax  
001E1356  lea         eax,[x2]  
001E1359  push        eax  
001E135A  call        dword ptr ds:[1E3038h]  
001E1360  mov         ecx,eax  
001E1362  call        dword ptr ds:[1E3038h]  

//=======================================复写传播
    int x3, y3, a,c;
    cin >> a>>c;
001E1368  mov         ecx,dword ptr ds:[1E3058h]  
001E136E  lea         eax,[c]  
001E1371  push        eax  
001E1372  lea         eax,[a]  
001E1375  push        eax  
001E1376  call        dword ptr ds:[1E3038h]  
001E137C  mov         ecx,eax  
001E137E  call        dword ptr ds:[1E3038h]  
    x3 = a;
001E1384  mov         ecx,dword ptr [a]  
    y3 = x3 + c;
//类似于常量传播,但目标变成了变量
//所以这里y3=x3+c中的x3被a替换,然后计算a+c的值赋给y3
001E1387  mov         eax,dword ptr [c]  
001E138A  add         eax,ecx  //eax和ecx中分别保存了变量c和a的值,
//此处为a+c,然后将结果存到eax中,并没有取变量x3的值与c相加。
//如果在y3=x3+c之前修改了变量x3的值,就不能进行复写传播优化了。
001E138C  mov         dword ptr [x3],ecx  
    cout << x3 << y3 << endl;
001E138F  push        1E1990h  
001E1394  push        eax  
001E1395  push        ecx  
001E1396  mov         ecx,dword ptr ds:[1E305Ch]  
001E139C  mov         dword ptr [y3],eax  //将a+c的结果赋给y3
001E139F  call        dword ptr ds:[1E3064h]  
001E13A5  mov         ecx,eax  
001E13A7  call        dword ptr ds:[1E3064h]  
001E13AD  mov         ecx,eax  
001E13AF  call        dword ptr ds:[1E3040h]  
    cin >> x3 >> y3;
001E13B5  mov         ecx,dword ptr ds:[1E3058h]  
001E13BB  lea         eax,[y3]  
001E13BE  push        eax  
001E13BF  lea         eax,[x3]  
001E13C2  push        eax  
001E13C3  call        dword ptr ds:[1E3038h]  
001E13C9  mov         ecx,eax  
001E13CB  call        dword ptr ds:[1E3038h]  

//=======================================剪去不可达分支(剪支优化)
    if (1 > 2)
        cout << "TRUE" << endl;
//因为1>2永远为假,分支中的代码不可能被执行,所以整个if代码块不产生指令。
//=======================================顺序语句代替分支
    int a2;
    cin >> a2;
001E13D1  mov         ecx,dword ptr ds:[1E3058h]  
001E13D7  lea         eax,[a2]  
001E13DA  push        eax  
001E13DB  call        dword ptr ds:[1E3038h]  
    a2 == 5 ?a2= 6 :a2= 7;
    cout << a2<< endl;
001E13E1  mov         ecx,dword ptr ds:[1E305Ch]  
    a2 == 5 ?a2= 6 :a2= 7;
    cout << a2<< endl;
//这是个条件语句,相当于if(a2==5).....else.........的分支结构
//这里把分支结构优化为了顺序语句
001E13E7  xor         eax,eax  
001E13E9  cmp         dword ptr [a2],5  //判断a2是否等于5
001E13ED  push        1E1990h  
//如果a2==5,则al=0,否则al=1;
001E13F2  setne       al  
//所以add eax,6  只有两个可能的值,6或7
//a2==5,则eax=6,否则eax=7,然后将eax赋给a2
001E13F5  add         eax,6  
001E13F8  push        eax  
001E13F9  mov         dword ptr [a2],eax  
001E13FC  call        dword ptr ds:[1E3064h]  
001E1402  mov         ecx,eax  
001E1404  call        dword ptr ds:[1E3040h]  

//=======================================强度削弱
    int x4, y4, a3;
    cin >> a3 ;
//强度削弱,就是用加法或移位代替乘法,用乘法或移位代替除法
001E140A  mov         ecx,dword ptr ds:[1E3058h]  
001E1410  lea         eax,[a3]  
001E1413  push        eax  
001E1414  call        dword ptr ds:[1E3038h]  
    x4 = a3*2;
001E141A  mov         eax,dword ptr [a3]  
001E141D  lea         ecx,[eax+eax]  //用加法代替乘法
    y4 = a3 / 4;
001E1420  cdq  
001E1421  and         edx,3  
001E1424  add         eax,edx  
001E1426  sar         eax,2  //用移位代替除法
    cout << x4 << y4;
001E1429  push        eax  
001E142A  push        ecx  
001E142B  mov         ecx,dword ptr ds:[1E305Ch]  
001E1431  call        dword ptr ds:[1E3064h]  
001E1437  mov         ecx,eax  
001E1439  call        dword ptr ds:[1E3064h]  

//=======================================数学变换
    int x5, y5, a4, b4;
    cin >> a4 >> b4;
001E143F  mov         ecx,dword ptr ds:[1E3058h]  

//=======================================数学变换
    int x5, y5, a4, b4;
    cin >> a4 >> b4;
001E1445  lea         eax,[b4]  
001E1448  push        eax  
001E1449  lea         eax,[a4]  
001E144C  push        eax  
001E144D  call        dword ptr ds:[1E3038h]  
001E1453  mov         ecx,eax  
001E1455  call        dword ptr ds:[1E3038h]  
    x5 = a4 * 1;
    y5 = a4*x5 + b4*x5;
//x=a+0,x=a*1等都是代数恒等式,不会产生运算指令
//y5=a4*x5+b4*x5=(a4+b4)*x5;所以此处先把a4和b4的值相加
//然后乘以x5的值,而x5又等于a4,所以乘的是变量a4,
//因为后面没有对x5的引用,因此x5被优化掉了(减少变量)
001E145B  mov         ecx,dword ptr [a4]  
001E145E  mov         eax,dword ptr [b4]  
001E1461  add         eax,ecx  //a4+b4
001E1463  imul        eax,ecx  //(a4+b4)*a4
    cout << x5 << y5 << endl;
001E1466  push        1E1990h  
001E146B  push        eax  
001E146C  push        ecx  
001E146D  mov         ecx,dword ptr ds:[1E305Ch]  
001E1473  call        dword ptr ds:[1E3064h]  
001E1479  mov         ecx,eax  
001E147B  call        dword ptr ds:[1E3064h]  
001E1481  mov         ecx,eax  
001E1483  call        dword ptr ds:[1E3040h]  

//=======================================代码外提
    int x6, y6;
    cin >> x6 >> y6;
001E1489  mov         ecx,dword ptr ds:[1E3058h]  
001E148F  lea         eax,[y6]  
001E1492  push        eax  
001E1493  lea         eax,[x6]  
001E1496  push        eax  
001E1497  call        dword ptr ds:[1E3038h]  
001E149D  mov         ecx,eax  
001E149F  call        dword ptr ds:[1E3038h]  
    while (x6 < y6 / 2)
//这类优化一般存在于循环中
//循环体内没有修改y6的值,所以在循环之前,计算出y6/2的值,
//然后在循环过程中,直接用y6/2的值与x6进行比较,而不必
//每循环一次,计算一次y6/2
001E14A5  mov         eax,dword ptr [y6]  
001E14A8  mov         ecx,dword ptr [x6]  
001E14AB  cdq  
001E14AC  sub         eax,edx  
001E14AE  sar         eax,1  //y6/2
001E14B0  cmp         ecx,eax  
001E14B2  jge         main+241h (01E14E1h)  
    {
        cout << x6 << endl;
001E14B4  push        1E1990h  
001E14B9  push        ecx  
001E14BA  mov         ecx,dword ptr ds:[1E305Ch]  
001E14C0  call        dword ptr ds:[1E3064h]  
001E14C6  mov         ecx,eax  
001E14C8  call        dword ptr ds:[1E3040h]  
001E14CE  mov         eax,dword ptr [y6]  
        x6++;
001E14D1  mov         ecx,dword ptr [x6]  
001E14D4  cdq  
001E14D5  inc         ecx  
001E14D6  sub         eax,edx  
001E14D8  mov         dword ptr [x6],ecx  
001E14DB  sar         eax,1  
001E14DD  cmp         ecx,eax  
001E14DF  jl          main+214h (01E14B4h)  
    }
//===============================================
    system("pause");
001E14E1  push        1E31C4h  
001E14E6  call        dword ptr ds:[1E30E8h]  
    return 0;
}
001E14EC  mov         ecx,dword ptr [ebp-4]  
001E14EF  add         esp,4  
001E14F2  xor         ecx,ebp  
001E14F4  xor         eax,eax  
001E14F6  call        __security_check_cookie (01E1BD2h)  
001E14FB  mov         esp,ebp  
001E14FD  pop         ebp  
001E14FE  ret  
View Code

 

C++反汇编笔记(五)编译器(VS2013)常用的几个优化技巧(1)

标签:

原文地址:http://www.cnblogs.com/nitianbenbendan/p/4396916.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!