一简单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的地址赋给eax008538B7 push eax ;压栈.作为参数008538B8 lea ecx,[z] ;将z的地址赋给ecx008538BB call point2d::operator point3d (085133Eh)
00853380 push ebp00853381 mov ebp,esp00853383 sub esp,0CCh00853389 push ebx0085338A push esi0085338B push edi0085338C push ecx0085338D lea edi,[ebp-0CCh]00853393 mov ecx,33h00853398 mov eax,0CCCCCCCCh0085339D 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变量的值赋给ecx008533AB 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的地址取出来.作为返回值}
浙公网安备 33010602011771号