你的位置:首页 > ASP.net教程

[ASP.net教程]C++反汇编学习笔记(五)编译器(VS2013)常用的几个优化技巧(1)


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

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

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

1、  常量折叠

  当计算公式中出现多个常量进行计算,且编译器可以在编译期间计算出结果时,这样原码中所有的常量计算都将被计算结果代替

  如:x=1+2结果必然是3,因此在编译期间直接生成x=3,没必要产生加法指令。

2、  常量传播

  如果在程序的逻辑中,声明的变量没有修改过,而且上下文中不存在针对此变量的取地址和间接访问操作,那么这个变量就等价与常量,编译器就认为可以删除该变量,直接用常量代替。使用常量的好处是可以生成立即数寻址的目标代码,减少了内存的访问次数。

  如:x=1+2;y=x+3;因为x已经计算出结果为3,所以x被常量3代替,这里直接生成y=6。

3、  公共表达式

  如:x=i*2;y=i*2;这时i*2被称为公共表达式,可归并为一个:x=i*2;y=x;得到x的值之后直接赋值给y,而不会再进行一次i*2的计算。

4、  复写传播

  类似常量传播,但目标变为了变量

  如x=a;.......y=x+c;如果在省略号表示的代码中没有修改变量x的值,则可以直接用变量a代替x,得到y=a+c。

5、  剪支优化

  如:if(1>2),因为条件永远为假,所以整个if代码块没有存在的必要,因此不会产生指令。

6、  顺序语句代替分支

  如if(2>1)....else.......在编译期间就可以计算出条件的真假,因此直接生成将被执行代码块的指令,优化掉判断和不可达的代码指令。

7、  数学变换

  像x=a+0;x=a-0;x=a*1;x=a/1都是代数恒等式,不会产生运算指令,直接生成x=a;

  x=a*y+b*y;等价于x=(a+b)*y,所以只需一次加法一次乘法即可。

8、  代码外提 

  这类优化一般存在于循环中

  如:while(x>y/2);如果循环体中没有修改y的值,那么没必要每次循环判定条件时,都进行一次y/2的运算,因此优化为:t=y/2;while(x>t);

 

第一格是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和y2001E1327 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的值赋给y3001E1387 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的结果赋给y3001E139F 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是否等于5001E13ED push    1E1990h //如果a2==5,则al=0,否则al=1;001E13F2 setne    al //所以add eax,6 只有两个可能的值,6或7//a2==5,则eax=6,否则eax=7,然后将eax赋给a2001E13F5 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+b4001E1463 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/2001E14A5 mov     eax,dword ptr [y6] 001E14A8 mov     ecx,dword ptr [x6] 001E14AB cdq 001E14AC sub     eax,edx 001E14AE sar     eax,1 //y6/2001E14B0 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