一简单c++程序之反汇编
#include<iostream>
using namespace std;
class point3d;
class point2d;
class point3d
{
private:int x; int y; int z;
public:
point3d(int a = 0, int b = 0, int c = 0) :x(a), y(b), z(c) {}
};
class point2d
{
int a;
int b;
public:
point2d(int x=0,int y=0):a(x),b(y){}
operator point3d()
{
return{ a,b,0 };
}
};
int main()
{
point2d z;
point3d q = z;
return 0;
}
反汇编后
point 2d z:(将调用构造函数
push 0(压入2个参数罢了)
push 0
lea ecx,[z] (将z对象的地址保存到ecx中)
call point2d::point2d (0C01348h)
mov dword ptr [this],ecx .将ecx(z对象的地址).保存到this指针当中
mov eax,dword ptr [this] .将z对象的地址赋给eax
mov ecx,dword ptr [x]; 将变量x的值取出来保存到ecx中
mov dword ptr [eax],ecx..将ecx=0赋给对象z的低4位(也就是a)
mov eax,dword ptr [this].将对象的地址赋给eax
mov ecx,dword ptr [y] 将变量y的值给ecx
mov dword ptr [eax+4],ecx 将y的值赋给高4位对象的地址(也就是b)
mov eax,dword ptr [this],将对象的地址给eax作为返回值
point3d q =z;
008538B4 lea eax,[q] ;将q的地址赋给eax
008538B7 push eax ;压栈.作为参数
008538B8 lea ecx,[z] ;将z的地址赋给ecx
008538BB call point2d::operator point3d (085133Eh)
00853380 push ebp
00853381 mov ebp,esp
00853383 sub esp,0CCh
00853389 push ebx
0085338A push esi
0085338B push edi
0085338C push ecx
0085338D lea edi,[ebp-0CCh]
00853393 mov ecx,33h
00853398 mov eax,0CCCCCCCCh
0085339D rep stos dword ptr es:[edi]
0085339F pop ecx ;
008533A0 mov dword ptr [this],ecx ;将 point2d z的地址赋给了this指针
return{ a,b,0 };
008533A3 push 0 ;0压栈
008533A5 mov eax,dword ptr [this]
008533A8 mov ecx,dword ptr [eax+4] ;将z的a变量的值赋给ecx
008533AB push ecx ;ecx压栈
008533AC mov edx,dword ptr [this]
008533AF mov eax,dword ptr [edx] ;将a的值赋给了eax中
008533B1 push eax ;eax压栈
008533B2 mov ecx,dword ptr [ebp+8] ;取出q的地址
008533B5 call point3d::point3d (0851357h) ;point3d(一个q的地址.参数.3个变量参数)
008533BA mov eax,dword ptr [ebp+8] ;将q的地址取出来.作为返回值
}