内置函数的反汇编解读

#include
  
  
   
   
using namespace std;
int max(int a,int b)
{
	if(a>b)
		return a;
	else
		return b;
}
int _tmain(int argc, _TCHAR* argv[])
{
	int a,b;
	cin>>a;
	cin>>b;
	cout<
   
   
    
    >a;
	cin>>b;

	cout<
    
    
     
     >a;
	cin>>b;
	cout<<max(b,a);
	return 0;
}

    
    
   
   
  
  

C++的代码很简单,只是输入a和b的值,然后进行比较,输出较大的那个,该过程执行三次

.text:00401000 ; int __cdecl wmain(int argc, wchar_t **argv)
.text:00401000 _wmain          proc near               ; CODE XREF: __tmainCRTStartup+11Dp
.text:00401000
.text:00401000 a               = dword ptr -8;变量a
.text:00401000 b               = dword ptr -4;变量b
.text:00401000 argc            = dword ptr  8
.text:00401000 argv            = dword ptr  0Ch
.text:00401000
.text:00401000                 push    ebp
.text:00401001                 mov     ebp, esp;函数开始的结尾
.text:00401003                 sub     esp, 8;函数因为变量而开辟了8个字节
.text:00401006                 mov     ecx, ds:std::basic_istream<char,std::char_traits
  
  
   
   > std::cin;>>操作符的第一个参数
.text:0040100C                 lea     eax, [ebp+a];//将变量a的地址放在eax当中
.text:0040100F                 push    eax;//将变量a的地址放在堆栈中
.text:00401010                 call    ds:std::basic_istream<char,std::char_traits
   
   
    
    >::operator>>(int &);>>执行该函数第一参数是cin,第二参数是变量a的地址
.text:00401016                 lea     ecx, [ebp+b]
.text:00401019                 push    ecx;//变量b地址入栈
.text:0040101A                 mov     ecx, ds:std::basic_istream<char,std::char_traits
    
    
     
     > std::cin;操作数的第一参数放在ecx当中
.text:00401020                 call    ds:std::basic_istream<char,std::char_traits
     
     
      
      >::operator>>(int &);//执行该函数的第一参数是放在ecx中的cin,第二参数是变量b的地址 
.text:00401026                 mov     eax, [ebp+a]
.text:00401029                 mov     ecx, [ebp+b]
.text:0040102C                 cmp     eax, ecx
.text:0040102E                 jg      short loc_401032;如果大于则跳转,
.text:00401030                 mov     eax, ecx;将较大的值放在eax当中
.text:00401032
.text:00401032 loc_401032:                             ; CODE XREF: _wmain+2Ej
.text:00401032                 mov     ecx, ds:std::basic_ostream<char,std::char_traits
      
      
        > std::cout .text:00401038 push eax .text:00401039 call ds:std::basic_ostream<char,std::char_traits 
       
         >::operator<<(int);//执行输出较大的那个值, .text:0040103F mov ecx, ds:std::basic_istream<char,std::char_traits 
        
          > std::cin;>>的第一参数 .text:00401045 lea edx, [ebp+a] .text:00401048 push edx .text:00401049 call ds:std::basic_istream<char,std::char_traits 
         
           >::operator>>(int &);执行输入a的值 .text:0040104F mov ecx, ds:std::basic_istream<char,std::char_traits 
          
            > std::cin .text:00401055 lea eax, [ebp+b] .text:00401058 push eax .text:00401059 call ds:std::basic_istream<char,std::char_traits 
           
             >::operator>>(int &);;执行输入b的值 .text:0040105F mov eax, [ebp+a] .text:00401062 mov ecx, [ebp+b] .text:00401065 cmp eax, ecx .text:00401067 jg short loc_40106B .text:00401069 mov eax, ecx;将较大的值放在eax当中 .text:0040106B .text:0040106B loc_40106B: ; CODE XREF: _wmain+67j .text:0040106B mov ecx, ds:std::basic_ostream<char,std::char_traits 
            
              > std::cout .text:00401071 push eax .text:00401072 call ds:std::basic_ostream<char,std::char_traits 
             
               >::operator<<(int)执行输出较大的那个值, .text:00401078 lea ecx, [ebp+a] .text:0040107B push ecx .text:0040107C mov ecx, ds:std::basic_istream<char,std::char_traits 
              
                > std::cin .text:00401082 call ds:std::basic_istream<char,std::char_traits 
               
                 >::operator>>(int &);执行输入a的值 .text:00401088 mov ecx, ds:std::basic_istream<char,std::char_traits 
                
                  > std::cin .text:0040108E lea edx, [ebp+b] .text:00401091 push edx .text:00401092 call ds:std::basic_istream<char,std::char_traits 
                 
                   >::operator>>(int &);执行输入b的值 .text:00401098 mov eax, [ebp+b] .text:0040109B mov ecx, [ebp+a] .text:0040109E cmp eax, ecx .text:004010A0 jg short loc_4010A4 .text:004010A2 mov eax, ecx;将较大的值放在eax当中 .text:004010A4 .text:004010A4 loc_4010A4: ; CODE XREF: _wmain+A0j .text:004010A4 mov ecx, ds:std::basic_ostream<char,std::char_traits 
                  
                    > std::cout .text:004010AA push eax .text:004010AB call ds:std::basic_ostream<char,std::char_traits 
                   
                     >::operator<<(int) .text:004010B1 xor eax, eax .text:004010B3 mov esp, ebp .text:004010B5 pop ebp .text:004010B6 retn .text:004010B6 _wmain endp PS:经验,对于<<和>>的第一参数也就是cin或者cout的地址是放在ecx当中的,另外,笔者使用的是VS2010,该编译器在执行时已经会自动进行了优化,如果a和b是给定的值,那么在编译时便会将a和b比较的结果,硬编码进程序!!!VS2010就是强大啊 
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        
      
     
     
    
    
   
   
  
  

内置函数既没有自己的函数开始标志,有没有自己的结束标志,他们的代码和调用该函数的局部变量在全部内置在调用函数内,编译结果看起来就好像没有调用函数一样,

该种方法的问题在于,会大大增加调用函数的尺寸。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值