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

时间:2022-03-08 00:55:45
   
   
   
  1. #include<iostream>
  2. using namespace std;
  3. class point3d;
  4. class point2d;
  5. class point3d
  6. {
  7. private:int x; int y; int z;
  8. public:
  9. point3d(int a = 0, int b = 0, int c = 0) :x(a), y(b), z(c) {}
  10. };
  11. class point2d
  12. {
  13. int a;
  14. int b;
  15. public:
  16. point2d(int x=0,int y=0):a(x),b(y){}
  17. operator point3d()
  18. {
  19. return{ a,b,0 };
  20. }
  21. };
  22. int main()
  23. {
  24. point2d z;
  25. point3d q = z;
  26. return 0;
  27. }
反汇编后
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;

   
   
   
  1. 008538B4 lea eax,[q] ;将q的地址赋给eax
  2. 008538B7 push eax ;压栈.作为参数
  3. 008538B8 lea ecx,[z] ;将z的地址赋给ecx
  4. 008538BB call point2d::operator point3d (085133Eh)
   
   
   
  1. 00853380 push ebp
  2. 00853381 mov ebp,esp
  3. 00853383 sub esp,0CCh
  4. 00853389 push ebx
  5. 0085338A push esi
  6. 0085338B push edi
  7. 0085338C push ecx
  8. 0085338D lea edi,[ebp-0CCh]
  9. 00853393 mov ecx,33h
  10. 00853398 mov eax,0CCCCCCCCh
  11. 0085339D rep stos dword ptr es:[edi]
  12. 0085339F pop ecx ;
  13. 008533A0 mov dword ptr [this],ecx ;将 point2d z的地址赋给了this指针
  14. return{ a,b,0 };
  15. 008533A3 push 0 ;0压栈
  16. 008533A5 mov eax,dword ptr [this]
  17. 008533A8 mov ecx,dword ptr [eax+4] ;将z的a变量的值赋给ecx
  18. 008533AB push ecx ;ecx压栈
  19. 008533AC mov edx,dword ptr [this]
  20. 008533AF mov eax,dword ptr [edx] ;将a的值赋给了eax中
  21. 008533B1 push eax ;eax压栈
  22. 008533B2 mov ecx,dword ptr [ebp+8] ;取出q的地址
  23. 008533B5 call point3d::point3d (0851357h) ;point3d(一个q的地址.参数.3个变量参数)
  24. 008533BA mov eax,dword ptr [ebp+8] ;将q的地址取出来.作为返回值
  25. }