C++反汇编实例(1)-输出多行

程序说明:输出多行内容,内容如下:

   *

  ***

 *****

*******

 *****

  ***

   *

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     cout << "   *" << endl;
 6     cout << "  ***" << endl;
 7     cout << " *****" << endl;
 8     cout << "*******" << endl;
 9     cout << " *****" << endl;
10     cout << "  ***" << endl;
11     cout << "   *" << endl;
12 
13     system("pause");
14     return 0;
15 }

debug下反汇编代码

int main()
{
00FF5E00  push        ebp  //进入函数后的第一件事,保存栈底指针,用来退出函数时还原栈底。
00FF5E01  mov         ebp,esp  //调整栈底指针到栈顶
00FF5E03  sub         esp,0C0h  //为局部变量申请内存空间
00FF5E09  push        ebx  
00FF5E0A  push        esi  
00FF5E0B  push        edi  //保存ebx,esi,edi,即保存现场,退出函数时还原。
00FF5E0C  lea         edi,[ebp-0C0h]  //将为局部变量分配的内存首地址放到edi中
00FF5E12  mov         ecx,30h  
00FF5E17  mov         eax,0CCCCCCCCh  //debug下,为调试方便,将所有局部变量初始化为0cccccccch。
00FF5E1C  rep stos    dword ptr es:[edi]  //用eax的值初始化到es:[edi]所指向的地址中(为局部变量分配的内存首地址),以dword(4字节)为单位,循环次数为ecx中的值。因为在一个函数内,
//为局部变量分配的内存空间是连续的,所以此句就是初始化所有局部变量为eax中的值。 cout
<< " *" << endl; 00FF5E1E mov esi,esp 00FF5E20 push 0FF14A6h 00FF5E25 push 0FFCC70h 00FF5E2A mov eax,dword ptr ds:[0100009Ch] 00FF5E2F push eax 00FF5E30 call std::operator<<<std::char_traits<char> > (0FF14BFh) //调用cout对象的operator<<成员函数(重载操作符<<)。 00FF5E35 add esp,8 00FF5E38 mov ecx,eax 00FF5E3A call dword ptr ds:[1000090h] 00FF5E40 cmp esi,esp 00FF5E42 call __RTC_CheckEsp (0FF132Fh) //debug下特有的函数,用来检测栈平衡。debug下函数退出时,都调用该函数。 cout << " ***" << endl; 00FF5E47 mov esi,esp 00FF5E49 push 0FF14A6h 00FF5E4E push 0FFCD24h 00FF5E53 mov eax,dword ptr ds:[0100009Ch] 00FF5E58 push eax 00FF5E59 call std::operator<<<std::char_traits<char> > (0FF14BFh) 00FF5E5E add esp,8 00FF5E61 mov ecx,eax 00FF5E63 call dword ptr ds:[1000090h] 00FF5E69 cmp esi,esp 00FF5E6B call __RTC_CheckEsp (0FF132Fh) cout << " *****" << endl; 00FF5E70 mov esi,esp cout << " *****" << endl; 00FF5E72 push 0FF14A6h 00FF5E77 push 0FFCE64h 00FF5E7C mov eax,dword ptr ds:[0100009Ch] 00FF5E81 push eax 00FF5E82 call std::operator<<<std::char_traits<char> > (0FF14BFh) 00FF5E87 add esp,8 00FF5E8A mov ecx,eax 00FF5E8C call dword ptr ds:[1000090h] 00FF5E92 cmp esi,esp 00FF5E94 call __RTC_CheckEsp (0FF132Fh) cout << "*******" << endl; 00FF5E99 mov esi,esp 00FF5E9B push 0FF14A6h 00FF5EA0 push 0FFD1A8h 00FF5EA5 mov eax,dword ptr ds:[0100009Ch] 00FF5EAA push eax 00FF5EAB call std::operator<<<std::char_traits<char> > (0FF14BFh) 00FF5EB0 add esp,8 00FF5EB3 mov ecx,eax 00FF5EB5 call dword ptr ds:[1000090h] 00FF5EBB cmp esi,esp 00FF5EBD call __RTC_CheckEsp (0FF132Fh) cout << " *****" << endl; 00FF5EC2 mov esi,esp 00FF5EC4 push 0FF14A6h 00FF5EC9 push 0FFCE64h 00FF5ECE mov eax,dword ptr ds:[0100009Ch] 00FF5ED3 push eax 00FF5ED4 call std::operator<<<std::char_traits<char> > (0FF14BFh) 00FF5ED9 add esp,8 00FF5EDC mov ecx,eax 00FF5EDE call dword ptr ds:[1000090h] 00FF5EE4 cmp esi,esp 00FF5EE6 call __RTC_CheckEsp (0FF132Fh) cout << " ***" << endl; 00FF5EEB mov esi,esp 00FF5EED push 0FF14A6h 00FF5EF2 push 0FFCD24h 00FF5EF7 mov eax,dword ptr ds:[0100009Ch] 00FF5EFC push eax 00FF5EFD call std::operator<<<std::char_traits<char> > (0FF14BFh) 00FF5F02 add esp,8 00FF5F05 mov ecx,eax 00FF5F07 call dword ptr ds:[1000090h] 00FF5F0D cmp esi,esp 00FF5F0F call __RTC_CheckEsp (0FF132Fh) cout << " *" << endl; 00FF5F14 mov esi,esp 00FF5F16 push 0FF14A6h 00FF5F1B push 0FFCC70h 00FF5F20 mov eax,dword ptr ds:[0100009Ch] 00FF5F25 push eax 00FF5F26 call std::operator<<<std::char_traits<char> > (0FF14BFh) 00FF5F2B add esp,8 00FF5F2E mov ecx,eax 00FF5F30 call dword ptr ds:[1000090h] 00FF5F36 cmp esi,esp 00FF5F38 call __RTC_CheckEsp (0FF132Fh) system("pause"); 00FF5F3D mov esi,esp 00FF5F3F push 0FFCBB0h 00FF5F44 call dword ptr ds:[10001D0h] 00FF5F4A add esp,4 00FF5F4D cmp esi,esp 00FF5F4F call __RTC_CheckEsp (0FF132Fh) return 0; 00FF5F54 xor eax,eax } 00FF5F56 pop edi 00FF5F57 pop esi 00FF5F58 pop ebx //恢复现场 00FF5F59 add esp,0C0h //C/C++函数调用约定默认为_cdecel方式,即由调用方平衡堆栈。 00FF5F5F cmp ebp,esp 00FF5F61 call __RTC_CheckEsp (0FF132Fh) 00FF5F66 mov esp,ebp //还原栈底指针 00FF5F68 pop ebp 00FF5F69 ret

 

release下优化后的反汇编代码

int main()
{
011412A0  push        ebp  //保存栈底指针
011412A1  mov         ebp,esp  //调整栈底指针到栈顶
011412A3  and         esp,0FFFFFFF8h  //为局部变量申请内存空间
    cout << "   *" << endl;
011412A6  push        1141A80h  
011412AB  push        ecx  
011412AC  mov         ecx,dword ptr ds:[1143054h]  
011412B2  mov         edx,11431BCh  
011412B7  call        std::operator<<<std::char_traits<char> > (01141840h)  
011412BC  add         esp,4  
011412BF  mov         ecx,eax  
011412C1  call        dword ptr ds:[1143034h]  
    cout << "  ***" << endl;
011412C7  push        1141A80h  
011412CC  push        ecx  
011412CD  mov         ecx,dword ptr ds:[1143054h]  
011412D3  mov         edx,11431C4h  
011412D8  call        std::operator<<<std::char_traits<char> > (01141840h)  
011412DD  add         esp,4  
011412E0  mov         ecx,eax  
011412E2  call        dword ptr ds:[1143034h]  
    cout << " *****" << endl;
011412E8  push        1141A80h  
011412ED  push        ecx  
011412EE  mov         ecx,dword ptr ds:[1143054h]  
011412F4  mov         edx,11431CCh  
011412F9  call        std::operator<<<std::char_traits<char> > (01141840h)  
011412FE  add         esp,4  
01141301  mov         ecx,eax  
01141303  call        dword ptr ds:[1143034h]  
    cout << "*******" << endl;
01141309  push        1141A80h  
0114130E  push        ecx  
0114130F  mov         ecx,dword ptr ds:[1143054h]  
01141315  mov         edx,11431D4h  
0114131A  call        std::operator<<<std::char_traits<char> > (01141840h)  
0114131F  add         esp,4  
01141322  mov         ecx,eax  
01141324  call        dword ptr ds:[1143034h]  
    cout << " *****" << endl;
0114132A  push        1141A80h  
    cout << " *****" << endl;
0114132F  push        ecx  
01141330  mov         ecx,dword ptr ds:[1143054h]  
01141336  mov         edx,11431CCh  
0114133B  call        std::operator<<<std::char_traits<char> > (01141840h)  
01141340  add         esp,4  
01141343  mov         ecx,eax  
01141345  call        dword ptr ds:[1143034h]  
    cout << "  ***" << endl;
0114134B  push        1141A80h  
01141350  push        ecx  
01141351  mov         ecx,dword ptr ds:[1143054h]  
01141357  mov         edx,11431C4h  
0114135C  call        std::operator<<<std::char_traits<char> > (01141840h)  
01141361  add         esp,4  
01141364  mov         ecx,eax  
01141366  call        dword ptr ds:[1143034h]  
    cout << "   *" << endl;
0114136C  push        1141A80h  
01141371  push        ecx  
01141372  mov         ecx,dword ptr ds:[1143054h]  
01141378  mov         edx,11431BCh  
0114137D  call        std::operator<<<std::char_traits<char> > (01141840h)  
01141382  add         esp,4  
01141385  mov         ecx,eax  
01141387  call        dword ptr ds:[1143034h]  

    system("pause");
0114138D  push        11431DCh  
01141392  call        dword ptr ds:[11430DCh]  
01141398  add         esp,4  
    return 0;
0114139B  xor         eax,eax  
}
0114139D  mov         esp,ebp  //还原栈顶指针
}
0114139F  pop         ebp  //恢复栈底指针
011413A0  ret  

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。