反汇编 c++类


调用类成员函数:

push  // 参数1

push //参数2

...    //参数n

mov ecx,this or   lea  ecx,xxx  ,   

call xxx // 调用成员函数

在调用成员函数之前必先把对象的首地址(this)赋给ecx:

两个例子

a.setZ(6);
004010DD  push        6    
004010DF  mov         ecx,dword ptr [a] 
004010E2  call        A::setZ (401020h) 



int w = a.getZ();
004010E7  mov         ecx,dword ptr [a] 
004010EA  call        A::getZ (401050h) 

并且就在call的前一句.



访问成员变量就更好说了,  this +8 ,this +c  这样的了



成员函数中访问成员变量:

也是通过this指针 ecx 来访问的,

例如: mov  dword ptr [ecx+4],5 

当然也可以把ecx 赋值到别的东西再来访问:

例如:

mov eax, ecx

mov dword ptr [eax+4],7

这都是一样的:

 

看两个Release版的成员函数的头:

virtual void setA(A &a)
{
004010B0  push        ebp  
004010B1  mov         ebp,esp 
004010B3  sub         esp,8 
004010B6  mov         dword ptr [ebp-8],ecx   // 这个变量就是this


  void setZ(int z)
{
00401020  push        ebp  
00401021  mov         ebp,esp 
00401023  push        ecx  
00401024  mov         dword ptr [ebp-4],ecx // 这个变量就是this


this 到底是 epb-4 呢还是 epb-8 呢, 这个得看这个函数的栈多大, 也就是局部变量的多少,   到底减几其实看  第三句 , esp 减多少,this就是 ebp 减多少. 如果没减就是 -4


你可能感兴趣的:(C++,c,汇编)