您的位置:首页 > 编程语言 > C语言/C++

一简单c++程序之反汇编

2016-08-10 00:47 375 查看
#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;


}

[/code]反汇编后point 2d z:(将调用构造函数push 0(压入2个参数罢了)push 0lea ecx,[z] (将z对象的地址保存到ecx中)call point2d::point2d (0C01348h)
mov dword ptr [this],ecx .将ecx(z对象的地址).保存到this指针当中
mov eax,dword ptr [this] .将z对象的地址赋给eaxmov ecx,dword ptr [x]; 将变量x的值取出来保存到ecx中mov dword ptr [eax],ecx..将ecx=0赋给对象z的低4位(也就是a)mov eax,dword ptr [this].将对象的地址赋给eaxmov ecx,dword ptr [y] 将变量y的值给ecxmov dword ptr [eax+4],ecx 将y的值赋给高4位对象的地址(也就是b)mov eax,dword ptr [this],将对象的地址给eax作为返回值

point3d q =z;
008538B4  lea eax,[q]  ;将q的地址赋给eax

008538B7  pusheax  ;压栈.作为参数

008538B8  lea ecx,[z]  ;将z的地址赋给ecx

008538BB  callpoint2d::operator point3d (085133Eh)  

[/code]
00853380  pushebp  

00853381  mov ebp,esp  

00853383  sub esp,0CCh  

00853389  pushebx  

0085338A  pushesi  

0085338B  pushedi  

0085338C  pushecx  

0085338D  lea edi,[ebp-0CCh]  

00853393  mov ecx,33h  

00853398  mov eax,0CCCCCCCCh  

0085339D  rep stosdword ptr es:[edi]  

0085339F  pop ecx  ;

008533A0  mov dword ptr [this],ecx ;将  point2d z的地址赋给了this指针

return{ a,b,0 };

008533A3  push0  ;0压栈

008533A5  mov eax,dword ptr [this]  

008533A8  mov ecx,dword ptr [eax+4]  ;将z的a变量的值赋给ecx

008533AB  pushecx  ;ecx压栈

008533AC  mov edx,dword ptr [this]  

008533AF  mov eax,dword ptr [edx] ;将a的值赋给了eax中 

008533B1  pusheax  ;eax压栈

008533B2  mov ecx,dword ptr [ebp+8]  ;取出q的地址

008533B5  callpoint3d::point3d (0851357h)  ;point3d(一个q的地址.参数.3个变量参数)

008533BA  mov eax,dword ptr [ebp+8]  ;将q的地址取出来.作为返回值

}

[/code]

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: