一個多態類的彙編代碼。

class CBase
{
public:
 virtual void show() = 0;
protected:
private:
};


class CBaseA : public CBase
{
public:
 virtual void show()
 {
  ;
 }

 void ShowInfo()
 {
  ;
 }
};

 

 

int _tmain(int argc, _TCHAR* argv[])
{
 CBaseA baseA;
 CBase *base = &baseA;

 baseA.show();
 baseA.ShowInfo();

 base->show();

 return 0;
}

 

 

//Debug

int _tmain(int argc, _TCHAR* argv[])
{
 012A1410  push        ebp 
  012A1411  mov         ebp,esp
  012A1413  sub         esp,0D8h
  012A1419  push        ebx 
  012A141A  push        esi 
  012A141B  push        edi 
  012A141C  lea         edi,[ebp-0D8h]
 012A1422  mov         ecx,36h
  012A1427  mov         eax,0CCCCCCCCh
  012A142C  rep stos    dword ptr es:[edi]
 CBaseA baseA;
 012A142E  lea         ecx,[baseA]
 012A1431  call        CBaseA::CBaseA (12A1118h)
  CBase *base = &baseA;
 012A1436  lea         eax,[baseA]
 012A1439  mov         dword ptr [base],eax

  baseA.show();
 012A143C  lea         ecx,[baseA]
 012A143F  call        CBaseA::show (12A1195h)
  baseA.ShowInfo();
 012A1444  lea         ecx,[baseA]
 012A1447  call        CBaseA::ShowInfo (12A10BEh)

  base->show();
 012A144C  mov         eax,dword ptr [base]
 012A144F  mov         edx,dword ptr [eax]
 012A1451  mov         esi,esp
  012A1453  mov         ecx,dword ptr [base]
 012A1456  mov         eax,dword ptr [edx]
 012A1458  call        eax 
  012A145A  cmp         esi,esp
  012A145C  call        @ILT+360(__RTC_CheckEsp) (12A116Dh)

  return 0;
 012A1461  xor         eax,eax
}

 

 

 

//Release

int _tmain(int argc, _TCHAR* argv[])
{
00151020  push        ecx 
 CBaseA baseA;
 CBase *base = &baseA;

 baseA.show();
00151021  mov         ecx,dword ptr [__imp_std::cout (152038h)]
00151027  push        offset string L"" (15211Ch)
0015102C  mov         dword ptr [esp+4],offset CBaseA::`vftable' (152124h)
00151034  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (15203Ch)]
 baseA.ShowInfo();
0015103A  mov         ecx,dword ptr [__imp_std::cout (152038h)]
00151040  push        offset string L"" (15211Ch)
00151045  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (15203Ch)]

 base->show();
0015104B  mov         eax,dword ptr [esp]
0015104E  mov         edx,dword ptr [eax]
00151050  lea         ecx,[esp]
00151053  call        edx 

 return 0;
00151055  xor         eax,eax
}

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章