IT공부/IT서적

[윤성우 열혈 C++프로그래밍] 어셈블리 코드 - Chapter1, Chapter2

shine94 2025. 3. 22. 20:45

* C++에서는

   프로그래머가 정의하는 헤더파일의 선언이 아닌, 표준 헤더파일의 선언에는 확장자를 생략하기로 약속되어 있다

 

int main(void)
{
00007FF646331020  sub         rsp,28h  
	cout << Adder() << endl;
00007FF646331024  mov         edx,2  
00007FF646331029  mov         ecx,1  
00007FF64633102E  call        Adder (07FF646331000h)  
00007FF646331033  mov         edx,eax  
00007FF646331035  mov         rcx,qword ptr [__imp_std::cout (07FF6463320A8h)]  
00007FF64633103C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6463320A0h)]  
00007FF646331042  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF6463310C0h)]  
00007FF646331049  mov         rcx,rax  
00007FF64633104C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF646332098h)]  
	cout << Adder(5) << endl;
00007FF646331052  mov         edx,2  
00007FF646331057  mov         ecx,5  
00007FF64633105C  call        Adder (07FF646331000h)  
00007FF646331061  mov         edx,eax  
00007FF646331063  mov         rcx,qword ptr [__imp_std::cout (07FF6463320A8h)]  
00007FF64633106A  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6463320A0h)]  
00007FF646331070  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF6463310C0h)]  
00007FF646331077  mov         rcx,rax  
00007FF64633107A  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF646332098h)]  
	cout << Adder(3, 5) << endl;
00007FF646331080  mov         edx,5  
00007FF646331085  mov         ecx,3  
00007FF64633108A  call        Adder (07FF646331000h)  
00007FF64633108F  mov         edx,eax  
00007FF646331091  mov         rcx,qword ptr [__imp_std::cout (07FF6463320A8h)]  
00007FF646331098  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6463320A0h)]  
00007FF64633109E  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF6463310C0h)]  
00007FF6463310A5  mov         rcx,rax  
00007FF6463310A8  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF646332098h)]  
	return 0;
00007FF6463310AE  xor         eax,eax  
}
00007FF6463310B0  add         rsp,28h  
00007FF6463310B4  ret

 

** std::cout은 전역 객체이며, 멤버 함수를 호출할 때 this 포인터가 rcx(ecx)에 들어간다

 

** eax가 cout << 주소값인 이유

   std::cout << "출력 문자열" 실행 후에도 std::cout이 반환되기 때문

template <class _Traits>
basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& _Ostr, const char* _Val);

 

   _Ostr 

   std::cout 객체 (std::ostream&)

 

   _Val 

   출력할 문자열

 

   반환값

    std::cout 객체 (std::ostream&) 그대로 반환

 

** 디폴트 매개변수 값은 선언부에만 작성 가능, 구현부에만 디폴트 값을 작성하면 컴파일 오류 발생

   [왜?] 함수 콜 이전에 매개변수 값을 호출부에서 미리 세팅해야 하기 때문에

 

** 부분적 디폴트 값

   디폴트 매개변수는 반드시 오른쪽부터 순차적으로 정의 필요

   만약, 오른쪽부터 채우지 않으면, 컴파일 오류가 발생

   [왜?] 함수 호출시 인자는 왼쪽에서 오른쪽으로 순차적으로 채워지기 때문

            즉, 매개변수는 항상 왼쪽부터 채워지므로,

                  디폴트 값이 적용될 수 있는 비어있는 부분은 반드시 오른쪽부터 존재해야 한다

   [만약 중간 매개변수만 디폴트 값을 지정한다면?]

   컴파일러가 어떤 값을 디폴트 값으로 대체해야 할 지 모호해지므로 오류가 발생

 

#include <iostream>
using namespace std;

inline int SQURE(int x)
{
	return x * x;
}

int main(void)
{
00007FF6B5A01000  sub         rsp,38h  
	cout << SQURE(5) << endl;
00007FF6B5A01004  mov         eax,5  
00007FF6B5A01009  imul        eax,eax,5  
00007FF6B5A0100C  mov         dword ptr [rsp+20h],eax  
00007FF6B5A01010  mov         eax,dword ptr [rsp+20h]  
00007FF6B5A01014  mov         edx,eax  
00007FF6B5A01016  mov         rcx,qword ptr [__imp_std::cout (07FF6B5A020A8h)]  
00007FF6B5A0101D  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6B5A020A0h)]  
00007FF6B5A01023  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF6B5A01070h)]  
00007FF6B5A0102A  mov         rcx,rax  
00007FF6B5A0102D  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6B5A02098h)]  
	cout << SQURE(12) << endl;
00007FF6B5A01033  mov         eax,0Ch  
00007FF6B5A01038  imul        eax,eax,0Ch  
00007FF6B5A0103B  mov         dword ptr [rsp+24h],eax  
00007FF6B5A0103F  mov         eax,dword ptr [rsp+24h]  
00007FF6B5A01043  mov         edx,eax  
00007FF6B5A01045  mov         rcx,qword ptr [__imp_std::cout (07FF6B5A020A8h)]  
00007FF6B5A0104C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6B5A020A0h)]  
00007FF6B5A01052  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF6B5A01070h)]  
00007FF6B5A01059  mov         rcx,rax  
00007FF6B5A0105C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6B5A02098h)]  
	return 0;
00007FF6B5A01062  xor         eax,eax  
}
00007FF6B5A01064  add         rsp,38h  
00007FF6B5A01068  ret

 

** 범위 지정 연산자(Space Resolution Operator)

   지역변수의 이름이 전역변수의 이름과 같은 경우, 전역변수는 지역변수에 의해 가려진다는 특징 존재

   이때, 전역변수에 접근하고 싶다면 범위 지정 연산자를 사용하면 됨

 

#include <iostream>
using namespace std;

int main(void)
{
00007FF72FD01000  sub         rsp,48h  
	int num = 10;
00007FF72FD01004  mov         dword ptr [num],0Ah  
	int i = 0;
00007FF72FD0100C  mov         dword ptr [i],0  
	
	cout << "true: " << true << endl;
00007FF72FD01014  lea         rdx,[__xmm@ffffffffffffffffffffffffffffffff+10h (07FF72FD032D0h)]  
00007FF72FD0101B  mov         rcx,qword ptr [__imp_std::cout (07FF72FD03098h)]  
00007FF72FD01022  call        std::operator<<<std::char_traits<char> > (07FF72FD013E0h)  
00007FF72FD01027  mov         dl,1  
00007FF72FD01029  mov         rcx,rax  
00007FF72FD0102C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD030A0h)]  
00007FF72FD01032  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF72FD01DC0h)]  
00007FF72FD01039  mov         rcx,rax  
00007FF72FD0103C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD030A8h)]  
	cout << "false: " << false << endl;
00007FF72FD01042  lea         rdx,[std::_Fake_alloc+1h (07FF72FD032D8h)]  
00007FF72FD01049  mov         rcx,qword ptr [__imp_std::cout (07FF72FD03098h)]  
00007FF72FD01050  call        std::operator<<<std::char_traits<char> > (07FF72FD013E0h)  
00007FF72FD01055  xor         edx,edx  
00007FF72FD01057  mov         rcx,rax  
00007FF72FD0105A  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD030A0h)]  
00007FF72FD01060  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF72FD01DC0h)]  
00007FF72FD01067  mov         rcx,rax  
00007FF72FD0106A  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD030A8h)]  
00007FF72FD01070  nop  

	while (true)
00007FF72FD01071  xor         eax,eax  
00007FF72FD01073  cmp         eax,1  
00007FF72FD01076  je          main+0BAh (07FF72FD010BAh)  
	{
		cout << i++ << ' ';
00007FF72FD01078  mov         eax,dword ptr [i]  
00007FF72FD0107C  mov         dword ptr [rsp+24h],eax  
00007FF72FD01080  mov         edx,dword ptr [rsp+24h]  
00007FF72FD01084  mov         rcx,qword ptr [__imp_std::cout (07FF72FD03098h)]  
00007FF72FD0108B  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD03090h)]  
00007FF72FD01091  mov         qword ptr [rsp+30h],rax  
00007FF72FD01096  mov         dl,20h  
00007FF72FD01098  mov         rcx,qword ptr [rsp+30h]  
00007FF72FD0109D  call        std::operator<<<std::char_traits<char> > (07FF72FD01900h)  
00007FF72FD010A2  mov         eax,dword ptr [i]  
00007FF72FD010A6  inc         eax  
00007FF72FD010A8  mov         dword ptr [i],eax  

		if (i > num)
00007FF72FD010AC  mov         eax,dword ptr [num]  
00007FF72FD010B0  cmp         dword ptr [i],eax  
00007FF72FD010B4  jle         main+0B8h (07FF72FD010B8h)  
			break;
00007FF72FD010B6  jmp         main+0BAh (07FF72FD010BAh)  

	}
00007FF72FD010B8  jmp         main+71h (07FF72FD01071h)  

	cout << endl;
00007FF72FD010BA  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF72FD01DC0h)]  
00007FF72FD010C1  mov         rcx,qword ptr [__imp_std::cout (07FF72FD03098h)]  
00007FF72FD010C8  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD030A8h)]  

	cout << "sizeof 1 : " << sizeof(1) << endl;
00007FF72FD010CE  lea         rdx,[std::_Fake_alloc+9h (07FF72FD032E0h)]  
00007FF72FD010D5  mov         rcx,qword ptr [__imp_std::cout (07FF72FD03098h)]  
00007FF72FD010DC  call        std::operator<<<std::char_traits<char> > (07FF72FD013E0h)  
00007FF72FD010E1  mov         edx,4  
00007FF72FD010E6  mov         rcx,rax  
00007FF72FD010E9  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD03080h)]  
00007FF72FD010EF  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF72FD01DC0h)]  
00007FF72FD010F6  mov         rcx,rax  
00007FF72FD010F9  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD030A8h)]  
	cout << "sizeof 0 : " << sizeof(0) << endl;
00007FF72FD010FF  lea         rdx,[std::_Fake_alloc+19h (07FF72FD032F0h)]  
00007FF72FD01106  mov         rcx,qword ptr [__imp_std::cout (07FF72FD03098h)]  
00007FF72FD0110D  call        std::operator<<<std::char_traits<char> > (07FF72FD013E0h)  
00007FF72FD01112  mov         edx,4  
00007FF72FD01117  mov         rcx,rax  
00007FF72FD0111A  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD03080h)]  
00007FF72FD01120  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF72FD01DC0h)]  
00007FF72FD01127  mov         rcx,rax  
00007FF72FD0112A  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD030A8h)]  
	cout << "sizeof true : " << sizeof(true) << endl;
00007FF72FD01130  lea         rdx,[std::_Fake_alloc+29h (07FF72FD03300h)]  
00007FF72FD01137  mov         rcx,qword ptr [__imp_std::cout (07FF72FD03098h)]  
00007FF72FD0113E  call        std::operator<<<std::char_traits<char> > (07FF72FD013E0h)  
00007FF72FD01143  mov         edx,1  
00007FF72FD01148  mov         rcx,rax  
00007FF72FD0114B  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD03080h)]  
00007FF72FD01151  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF72FD01DC0h)]  
00007FF72FD01158  mov         rcx,rax  
00007FF72FD0115B  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD030A8h)]  
	cout << "sizeof false : " << sizeof(false) << endl;
00007FF72FD01161  lea         rdx,[std::_Fake_alloc+39h (07FF72FD03310h)]  
00007FF72FD01168  mov         rcx,qword ptr [__imp_std::cout (07FF72FD03098h)]  
00007FF72FD0116F  call        std::operator<<<std::char_traits<char> > (07FF72FD013E0h)  
00007FF72FD01174  mov         edx,1  
00007FF72FD01179  mov         rcx,rax  
00007FF72FD0117C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD03080h)]  
00007FF72FD01182  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF72FD01DC0h)]  
00007FF72FD01189  mov         rcx,rax  
00007FF72FD0118C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF72FD030A8h)]  

	return 0;
00007FF72FD01192  xor         eax,eax  
}
00007FF72FD01194  add         rsp,48h  
00007FF72FD01198  ret

 

* rsp+24h

   임시 저장 공간으로 사용

   cout << i++ << ' ';의 i++ 후위 연산을 처리하기 위해 사용 

 

* 참조자

   자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름

   즉, 별칭

 

#include <iostream>
using namespace std;

int main(void)
{
00007FF600B61000  sub         rsp,48h  
00007FF600B61004  mov         rax,qword ptr [__security_cookie (07FF600B65000h)]  
00007FF600B6100B  xor         rax,rsp  
00007FF600B6100E  mov         qword ptr [rsp+30h],rax  
	int num1 = 1020;
00007FF600B61013  mov         dword ptr [num1],3FCh  
	int& num2 = num1;
00007FF600B6101B  lea         rax,[num1]  
00007FF600B61020  mov         qword ptr [num2],rax  

	num2 = 3047;
00007FF600B61025  mov         rax,qword ptr [num2]  
00007FF600B6102A  mov         dword ptr [rax],0BE7h  
	cout << "VAL: " << num1 << endl;
00007FF600B61030  lea         rdx,[__xmm@ffffffffffffffffffffffffffffffff+10h (07FF600B632C0h)]  
00007FF600B61037  mov         rcx,qword ptr [__imp_std::cout (07FF600B63090h)]  
00007FF600B6103E  call        std::operator<<<std::char_traits<char> > (07FF600B61350h)  
00007FF600B61043  mov         edx,dword ptr [num1]  
00007FF600B61047  mov         rcx,rax  
00007FF600B6104A  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF600B63088h)]  
00007FF600B61050  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF600B61870h)]  
00007FF600B61057  mov         rcx,rax  
00007FF600B6105A  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF600B63098h)]  
	cout << "REF: " << num2 << endl;
00007FF600B61060  lea         rdx,[std::_Fake_alloc+2h (07FF600B632C8h)]  
00007FF600B61067  mov         rcx,qword ptr [__imp_std::cout (07FF600B63090h)]  
00007FF600B6106E  call        std::operator<<<std::char_traits<char> > (07FF600B61350h)  
00007FF600B61073  mov         rcx,qword ptr [num2]  
00007FF600B61078  mov         edx,dword ptr [rcx]  
00007FF600B6107A  mov         rcx,rax  
00007FF600B6107D  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF600B63088h)]  
00007FF600B61083  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF600B61870h)]  
00007FF600B6108A  mov         rcx,rax  
00007FF600B6108D  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF600B63098h)]  

	cout << "VAL: " << &num1 << endl;
00007FF600B61093  lea         rdx,[std::_Fake_alloc+0Ah (07FF600B632D0h)]  
00007FF600B6109A  mov         rcx,qword ptr [__imp_std::cout (07FF600B63090h)]  
00007FF600B610A1  call        std::operator<<<std::char_traits<char> > (07FF600B61350h)  
00007FF600B610A6  lea         rdx,[num1]  
00007FF600B610AB  mov         rcx,rax  
00007FF600B610AE  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF600B63080h)]  
00007FF600B610B4  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF600B61870h)]  
00007FF600B610BB  mov         rcx,rax  
00007FF600B610BE  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF600B63098h)]  
	cout << "REF: " << &num2 << endl;
00007FF600B610C4  lea         rdx,[std::_Fake_alloc+12h (07FF600B632D8h)]  
00007FF600B610CB  mov         rcx,qword ptr [__imp_std::cout (07FF600B63090h)]  
00007FF600B610D2  call        std::operator<<<std::char_traits<char> > (07FF600B61350h)  
00007FF600B610D7  mov         rdx,qword ptr [num2]  
00007FF600B610DC  mov         rcx,rax  
00007FF600B610DF  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF600B63080h)]  
00007FF600B610E5  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF600B61870h)]  
00007FF600B610EC  mov         rcx,rax  
00007FF600B610EF  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF600B63098h)]  
	return 0;
00007FF600B610F5  xor         eax,eax  
}
00007FF600B610F7  mov         rcx,qword ptr [rsp+30h]  
00007FF600B610FC  xor         rcx,rsp  
00007FF600B610FF  call        __security_check_cookie (07FF600B618D0h)  
00007FF600B61104  add         rsp,48h  
00007FF600B61108  ret

 

 

* 참조자는 어셈블리로 보면, 포인터와 같음

 

* 참조자는

   선언과 동시에 누군가를 반드시 참조해야 함 → 즉, NULL로 초기화 불가능!!

   변수에 또다른 이름을 붙여주는 것이 목적이기 때문에 상수를 대상으로 참조자를 선언할 수 없다!!

 

#include <iostream>
using namespace std;

int main(void)
{
00007FF706FC1000  sub         rsp,58h  
00007FF706FC1004  mov         rax,qword ptr [__security_cookie (07FF706FC4000h)]  
00007FF706FC100B  xor         rax,rsp  
00007FF706FC100E  mov         qword ptr [rsp+48h],rax  
	int arr[3] = { 1, 3, 5 };
00007FF706FC1013  mov         dword ptr [arr],1  
00007FF706FC101B  mov         dword ptr [rsp+3Ch],3  
00007FF706FC1023  mov         dword ptr [rsp+40h],5  
	int& ref1 = arr[0];
00007FF706FC102B  mov         eax,4  
00007FF706FC1030  imul        rax,rax,0  
00007FF706FC1034  lea         rax,arr[rax]  
00007FF706FC1039  mov         qword ptr [ref1],rax  
	int& ref2 = arr[1];
00007FF706FC103E  mov         eax,4  
00007FF706FC1043  imul        rax,rax,1  
00007FF706FC1047  lea         rax,arr[rax]  
00007FF706FC104C  mov         qword ptr [ref2],rax  
	int& ref3 = arr[2];
00007FF706FC1051  mov         eax,4  
00007FF706FC1056  imul        rax,rax,2  
00007FF706FC105A  lea         rax,arr[rax]  
00007FF706FC105F  mov         qword ptr [ref3],rax  

	cout << ref1 << endl;
00007FF706FC1064  mov         rax,qword ptr [ref1]  
00007FF706FC1069  mov         edx,dword ptr [rax]  
00007FF706FC106B  mov         rcx,qword ptr [__imp_std::cout (07FF706FC20A8h)]  
00007FF706FC1072  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF706FC20A0h)]  
00007FF706FC1078  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF706FC10F0h)]  
00007FF706FC107F  mov         rcx,rax  
00007FF706FC1082  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF706FC2098h)]  
	cout << ref2 << endl;
00007FF706FC1088  mov         rax,qword ptr [ref2]  
00007FF706FC108D  mov         edx,dword ptr [rax]  
00007FF706FC108F  mov         rcx,qword ptr [__imp_std::cout (07FF706FC20A8h)]  
00007FF706FC1096  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF706FC20A0h)]  
00007FF706FC109C  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF706FC10F0h)]  
00007FF706FC10A3  mov         rcx,rax  
00007FF706FC10A6  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF706FC2098h)]  
	cout << ref3 << endl;
00007FF706FC10AC  mov         rax,qword ptr [ref3]  
00007FF706FC10B1  mov         edx,dword ptr [rax]  
00007FF706FC10B3  mov         rcx,qword ptr [__imp_std::cout (07FF706FC20A8h)]  
00007FF706FC10BA  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF706FC20A0h)]  
00007FF706FC10C0  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF706FC10F0h)]  
00007FF706FC10C7  mov         rcx,rax  
00007FF706FC10CA  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF706FC2098h)]  

	return 0;
00007FF706FC10D0  xor         eax,eax  
}
00007FF706FC10D2  mov         rcx,qword ptr [rsp+48h]  
00007FF706FC10D7  xor         rcx,rsp  
00007FF706FC10DA  call        __security_check_cookie (07FF706FC1150h)  
00007FF706FC10DF  add         rsp,58h  
00007FF706FC10E3  ret

 

#include <iostream>
using namespace std;

int main(void)
{
00007FF680951000  sub         rsp,68h  
00007FF680951004  mov         rax,qword ptr [__security_cookie (07FF680954000h)]  
00007FF68095100B  xor         rax,rsp  
00007FF68095100E  mov         qword ptr [rsp+50h],rax  
	int num = 12;
00007FF680951013  mov         dword ptr [num],0Ch  
	int* ptr = &num;
00007FF68095101B  lea         rax,[num]  
00007FF680951020  mov         qword ptr [ptr],rax  
	int** dptr = &ptr;
00007FF680951025  lea         rax,[ptr]  
00007FF68095102A  mov         qword ptr [dptr],rax  

	int& ref = num;
00007FF68095102F  lea         rax,[num]  
00007FF680951034  mov         qword ptr [ref],rax  
	int* (&pref) = ptr;
00007FF680951039  lea         rax,[ptr]  
00007FF68095103E  mov         qword ptr [pref],rax  
	int** (&dpref) = dptr;
00007FF680951043  lea         rax,[dptr]  
00007FF680951048  mov         qword ptr [dpref],rax  

	cout << ref << endl;
00007FF68095104D  mov         rax,qword ptr [ref]  
00007FF680951052  mov         edx,dword ptr [rax]  
00007FF680951054  mov         rcx,qword ptr [__imp_std::cout (07FF6809520A8h)]  
00007FF68095105B  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6809520A0h)]  
00007FF680951061  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF6809510E0h)]  
00007FF680951068  mov         rcx,rax  
00007FF68095106B  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF680952098h)]  
	cout << *pref << endl;
00007FF680951071  mov         rax,qword ptr [pref]  
00007FF680951076  mov         rax,qword ptr [rax]  
00007FF680951079  mov         edx,dword ptr [rax]  
00007FF68095107B  mov         rcx,qword ptr [__imp_std::cout (07FF6809520A8h)]  
00007FF680951082  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6809520A0h)]  
00007FF680951088  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF6809510E0h)]  
00007FF68095108F  mov         rcx,rax  
00007FF680951092  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF680952098h)]  
	cout << **dpref << endl;
00007FF680951098  mov         rax,qword ptr [dpref]  
00007FF68095109D  mov         rax,qword ptr [rax]  
00007FF6809510A0  mov         rax,qword ptr [rax]  
00007FF6809510A3  mov         edx,dword ptr [rax]  
00007FF6809510A5  mov         rcx,qword ptr [__imp_std::cout (07FF6809520A8h)]  
00007FF6809510AC  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF6809520A0h)]  
00007FF6809510B2  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF6809510E0h)]  
00007FF6809510B9  mov         rcx,rax  
00007FF6809510BC  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF680952098h)]  

	return 0;
00007FF6809510C2  xor         eax,eax  
}
00007FF6809510C4  mov         rcx,qword ptr [rsp+50h]  
00007FF6809510C9  xor         rcx,rsp  
00007FF6809510CC  call        __security_check_cookie (07FF680951140h)  
00007FF6809510D1  add         rsp,68h  
00007FF6809510D5  ret

 

int main(void)
{
00007FF613B61040  sub         rsp,48h  
00007FF613B61044  mov         rax,qword ptr [__security_cookie (07FF613B65000h)]  
00007FF613B6104B  xor         rax,rsp  
00007FF613B6104E  mov         qword ptr [rsp+30h],rax  
	int num1 = 1;
00007FF613B61053  mov         dword ptr [num1],1  
	int& num2 = RefFuncOne_1(num1);
00007FF613B6105B  lea         rcx,[num1]  
00007FF613B61060  call        RefFuncOne_1 (07FF613B61000h)  
00007FF613B61065  mov         qword ptr [num2],rax  

	num1++;
00007FF613B6106A  mov         eax,dword ptr [num1]  
00007FF613B6106E  inc         eax  
00007FF613B61070  mov         dword ptr [num1],eax  
	num2++;
00007FF613B61074  mov         rax,qword ptr [num2]  
00007FF613B61079  mov         eax,dword ptr [rax]  
00007FF613B6107B  inc         eax  
00007FF613B6107D  mov         rcx,qword ptr [num2]  
00007FF613B61082  mov         dword ptr [rcx],eax  
	cout << "num1: " << num1 << endl;
00007FF613B61084  lea         rdx,[__xmm@ffffffffffffffffffffffffffffffff+10h (07FF613B632C0h)]  
00007FF613B6108B  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B61092  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B61097  mov         edx,dword ptr [num1]  
00007FF613B6109B  mov         rcx,rax  
00007FF613B6109E  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B610A4  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B610AB  mov         rcx,rax  
00007FF613B610AE  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
	cout << "num2: " << num2 << endl << endl << endl;
00007FF613B610B4  lea         rdx,[std::_Fake_alloc+1h (07FF613B632C8h)]  
00007FF613B610BB  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B610C2  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B610C7  mov         rcx,qword ptr [num2]  
00007FF613B610CC  mov         edx,dword ptr [rcx]  
00007FF613B610CE  mov         rcx,rax  
00007FF613B610D1  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B610D7  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B610DE  mov         rcx,rax  
00007FF613B610E1  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
00007FF613B610E7  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B610EE  mov         rcx,rax  
00007FF613B610F1  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
00007FF613B610F7  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B610FE  mov         rcx,rax  
00007FF613B61101  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  

	num1 = 1;
00007FF613B61107  mov         dword ptr [num1],1  
	num2 = RefFuncOne_2(num1);
00007FF613B6110F  lea         rcx,[num1]  
00007FF613B61114  call        RefFuncOne_2 (07FF613B61020h)  
00007FF613B61119  mov         rcx,qword ptr [num2]  
00007FF613B6111E  mov         dword ptr [rcx],eax  
	

	num1++;
00007FF613B61120  mov         eax,dword ptr [num1]  
00007FF613B61124  inc         eax  
00007FF613B61126  mov         dword ptr [num1],eax  
	num2++;
00007FF613B6112A  mov         rax,qword ptr [num2]  
00007FF613B6112F  mov         eax,dword ptr [rax]  
00007FF613B61131  inc         eax  
00007FF613B61133  mov         rcx,qword ptr [num2]  
00007FF613B61138  mov         dword ptr [rcx],eax  
	cout << "num1: " << num1 << endl;
00007FF613B6113A  lea         rdx,[std::_Fake_alloc+9h (07FF613B632D0h)]  
00007FF613B61141  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B61148  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B6114D  mov         edx,dword ptr [num1]  
00007FF613B61151  mov         rcx,rax  
00007FF613B61154  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B6115A  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B61161  mov         rcx,rax  
00007FF613B61164  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
	cout << "num2: " << num2 << endl << endl << endl;
00007FF613B6116A  lea         rdx,[std::_Fake_alloc+11h (07FF613B632D8h)]  
00007FF613B61171  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B61178  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B6117D  mov         rcx,qword ptr [num2]  
00007FF613B61182  mov         edx,dword ptr [rcx]  
00007FF613B61184  mov         rcx,rax  
00007FF613B61187  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B6118D  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B61194  mov         rcx,rax  
00007FF613B61197  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
00007FF613B6119D  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B611A4  mov         rcx,rax  
00007FF613B611A7  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
00007FF613B611AD  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B611B4  mov         rcx,rax  
00007FF613B611B7  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  

	int num3 = RefFuncOne_2(num1);
00007FF613B611BD  lea         rcx,[num1]  
00007FF613B611C2  call        RefFuncOne_2 (07FF613B61020h)  
00007FF613B611C7  mov         dword ptr [num3],eax  

	cout << "num1: " << num1 << endl;
00007FF613B611CB  lea         rdx,[std::_Fake_alloc+19h (07FF613B632E0h)]  
00007FF613B611D2  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B611D9  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B611DE  mov         edx,dword ptr [num1]  
00007FF613B611E2  mov         rcx,rax  
00007FF613B611E5  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B611EB  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B611F2  mov         rcx,rax  
00007FF613B611F5  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
	cout << "num2: " << num2 << endl;
00007FF613B611FB  lea         rdx,[std::_Fake_alloc+21h (07FF613B632E8h)]  
00007FF613B61202  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B61209  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B6120E  mov         rcx,qword ptr [num2]  
00007FF613B61213  mov         edx,dword ptr [rcx]  
00007FF613B61215  mov         rcx,rax  
00007FF613B61218  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B6121E  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B61225  mov         rcx,rax  
00007FF613B61228  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
	cout << "num3: " << num3 << endl << endl << endl;
00007FF613B6122E  lea         rdx,[std::_Fake_alloc+29h (07FF613B632F0h)]  
00007FF613B61235  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B6123C  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B61241  mov         edx,dword ptr [num3]  
00007FF613B61245  mov         rcx,rax  
00007FF613B61248  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B6124E  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B61255  mov         rcx,rax  
00007FF613B61258  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
00007FF613B6125E  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B61265  mov         rcx,rax  
00007FF613B61268  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
00007FF613B6126E  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B61275  mov         rcx,rax  
00007FF613B61278  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  

	num1++;
00007FF613B6127E  mov         eax,dword ptr [num1]  
00007FF613B61282  inc         eax  
00007FF613B61284  mov         dword ptr [num1],eax  
	num2++;
00007FF613B61288  mov         rax,qword ptr [num2]  
00007FF613B6128D  mov         eax,dword ptr [rax]  
00007FF613B6128F  inc         eax  
00007FF613B61291  mov         rcx,qword ptr [num2]  
00007FF613B61296  mov         dword ptr [rcx],eax  
	num3++;
00007FF613B61298  mov         eax,dword ptr [num3]  
00007FF613B6129C  inc         eax  
00007FF613B6129E  mov         dword ptr [num3],eax  

	cout << "num1: " << num1 << endl;
00007FF613B612A2  lea         rdx,[std::_Fake_alloc+31h (07FF613B632F8h)]  
00007FF613B612A9  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B612B0  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B612B5  mov         edx,dword ptr [num1]  
00007FF613B612B9  mov         rcx,rax  
00007FF613B612BC  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B612C2  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B612C9  mov         rcx,rax  
00007FF613B612CC  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
	cout << "num2: " << num2 << endl;
00007FF613B612D2  lea         rdx,[std::_Fake_alloc+39h (07FF613B63300h)]  
00007FF613B612D9  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B612E0  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B612E5  mov         rcx,qword ptr [num2]  
00007FF613B612EA  mov         edx,dword ptr [rcx]  
00007FF613B612EC  mov         rcx,rax  
00007FF613B612EF  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B612F5  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B612FC  mov         rcx,rax  
00007FF613B612FF  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
	cout << "num3: " << num3 << endl << endl << endl;
00007FF613B61305  lea         rdx,[std::_Fake_alloc+41h (07FF613B63308h)]  
00007FF613B6130C  mov         rcx,qword ptr [__imp_std::cout (07FF613B63088h)]  
00007FF613B61313  call        std::operator<<<std::char_traits<char> > (07FF613B615B0h)  
00007FF613B61318  mov         edx,dword ptr [num3]  
00007FF613B6131C  mov         rcx,rax  
00007FF613B6131F  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63080h)]  
00007FF613B61325  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B6132C  mov         rcx,rax  
00007FF613B6132F  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
00007FF613B61335  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B6133C  mov         rcx,rax  
00007FF613B6133F  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  
00007FF613B61345  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF613B61AD0h)]  
00007FF613B6134C  mov         rcx,rax  
00007FF613B6134F  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF613B63090h)]  

	return 0;
00007FF613B61355  xor         eax,eax  
}
00007FF613B61357  mov         rcx,qword ptr [rsp+30h]  
00007FF613B6135C  xor         rcx,rsp  
00007FF613B6135F  call        __security_check_cookie (07FF613B61B30h)  
00007FF613B61364  add         rsp,48h  
00007FF613B61368  ret

 

 

https://shine94.tistory.com/408

 

[C++] 참조값 리턴

* 참조값을 리턴할 때,    호출자가 리턴값을 어떻게 받느냐에 따라 그 리턴값이 참조로 쓰일지 복사된 값으로 쓰일지 결정된다   ㄴ 리턴이 값(int)이면 무조건 복사됨 → 호출자가 참조로 받

shine94.tistory.com

https://shine94.tistory.com/409

 

[C++] const T&(읽기 전용 참조), T&&(우변 참조, 이동 가능)

* const T&(읽기 전용 참조)   - lvalue, rvalue 모두 받을 수 있음   - 복사 없이 임시값도 참조 가능   - 수정 불가   [사용 목적] 값을 읽기만 할 때, 복사 비용을 줄이면서 원본을 변경하지 않기 위

shine94.tistory.com

 

* malloc

   __imp__malloc → __malloc_base → __imp_HeapAlloc

   __imp__malloc → _malloc_dbg → heap_alloc_dbg : 할당 시 cd로 밀어버림

 

* free

   __imp_free → _free_base → __imp_HeapFree

   __imp_free → _free_dbg → free_dbg_nolock → _free_base → __imp_HeapFree : 해제 시 dd로 밀어버림

 

* new[] - 값

   operator new[] → operator new →  malloc

 

* delete[] - 값

   operator delete[] →  operator delete →   __imp_free

   operator delete[] →  operator delete  _free_dbg

 

#include <iostream>
#include <cstdlib>
using namespace std;

class Simple
{
public:
	Simple()
	{
		cout << "I'm Simple constructor!" << endl;
	}
};

int main(void)
{
00007FF63EA31000  sub         rsp,68h  
	Simple* sp1, * sp2;
	Simple sp3;
00007FF63EA31004  lea         rdx,[string "I'm Simple constructor!" (07FF63EA33390h)]  
00007FF63EA3100B  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA31012  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA31017  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA3101E  mov         rcx,rax  
00007FF63EA31021  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
00007FF63EA31027  nop  
	cout << "case 1(" << sizeof(sp1) << "):";
00007FF63EA31028  lea         rdx,[std::_Fake_alloc+5h (07FF63EA333B0h)]  
00007FF63EA3102F  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA31036  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA3103B  mov         edx,8  
00007FF63EA31040  mov         rcx,rax  
00007FF63EA31043  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33080h)]  
00007FF63EA31049  lea         rdx,[string "I'm Simple constructor!"+18h (07FF63EA333A8h)]  
00007FF63EA31050  mov         rcx,rax  
00007FF63EA31053  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA31058  nop  
	sp1 = new Simple;
00007FF63EA31059  mov         ecx,1  
00007FF63EA3105E  call        operator new (07FF63EA31AB0h)  
00007FF63EA31063  mov         qword ptr [rsp+28h],rax  
00007FF63EA31068  cmp         qword ptr [rsp+28h],0  
00007FF63EA3106E  je          main+0AAh (07FF63EA310AAh)  
00007FF63EA31070  lea         rdx,[string "I'm Simple constructor!" (07FF63EA33390h)]  
00007FF63EA31077  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA3107E  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA31083  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA3108A  mov         rcx,rax  
00007FF63EA3108D  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
00007FF63EA31093  nop  
00007FF63EA31094  mov         rax,qword ptr [rsp+28h]  
00007FF63EA31099  mov         qword ptr [rsp+40h],rax  
00007FF63EA3109E  mov         rax,qword ptr [rsp+40h]  
00007FF63EA310A3  mov         qword ptr [rsp+30h],rax  
00007FF63EA310A8  jmp         main+0B3h (07FF63EA310B3h)  
00007FF63EA310AA  mov         qword ptr [rsp+30h],0  
00007FF63EA310B3  mov         rax,qword ptr [rsp+30h]  
00007FF63EA310B8  mov         qword ptr [rsp+48h],rax  
00007FF63EA310BD  mov         rax,qword ptr [rsp+48h]  
00007FF63EA310C2  mov         qword ptr [sp1],rax  

	cout << endl << "=======================" << endl;
00007FF63EA310C7  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA310CE  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA310D5  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
00007FF63EA310DB  lea         rdx,[std::_Fake_alloc+0Dh (07FF63EA333B8h)]  
00007FF63EA310E2  mov         rcx,rax  
00007FF63EA310E5  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA310EA  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA310F1  mov         rcx,rax  
00007FF63EA310F4  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
	cout << "case 2(" << sizeof(sp2) << "):";
00007FF63EA310FA  lea         rdx,[std::_Fake_alloc+2Dh (07FF63EA333D8h)]  
00007FF63EA31101  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA31108  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA3110D  mov         edx,8  
00007FF63EA31112  mov         rcx,rax  
00007FF63EA31115  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33080h)]  
00007FF63EA3111B  lea         rdx,[std::_Fake_alloc+25h (07FF63EA333D0h)]  
00007FF63EA31122  mov         rcx,rax  
00007FF63EA31125  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
	sp2 = (Simple*)malloc(sizeof(Simple) * 1);
00007FF63EA3112A  mov         ecx,1  
00007FF63EA3112F  call        qword ptr [__imp_malloc (07FF63EA33158h)]  
00007FF63EA31135  mov         qword ptr [sp2],rax  

	cout << endl << "=======================" << endl;
00007FF63EA3113A  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA31141  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA31148  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
00007FF63EA3114E  lea         rdx,[std::_Fake_alloc+35h (07FF63EA333E0h)]  
00007FF63EA31155  mov         rcx,rax  
00007FF63EA31158  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA3115D  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA31164  mov         rcx,rax  
00007FF63EA31167  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
	cout << "case 3(" << sizeof(sp3) << "):";
00007FF63EA3116D  lea         rdx,[std::_Fake_alloc+55h (07FF63EA33400h)]  
00007FF63EA31174  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA3117B  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA31180  mov         edx,1  
00007FF63EA31185  mov         rcx,rax  
00007FF63EA31188  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33080h)]  
00007FF63EA3118E  lea         rdx,[std::_Fake_alloc+4Dh (07FF63EA333F8h)]  
00007FF63EA31195  mov         rcx,rax  
00007FF63EA31198  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA3119D  nop  
	sp3 = Simple();
00007FF63EA3119E  lea         rdx,[string "I'm Simple constructor!" (07FF63EA33390h)]  
00007FF63EA311A5  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA311AC  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA311B1  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA311B8  mov         rcx,rax  
00007FF63EA311BB  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
00007FF63EA311C1  nop  

	cout << endl << "=======================" << endl;
00007FF63EA311C2  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA311C9  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA311D0  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
00007FF63EA311D6  lea         rdx,[std::_Fake_alloc+5Dh (07FF63EA33408h)]  
00007FF63EA311DD  mov         rcx,rax  
00007FF63EA311E0  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA311E5  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA311EC  mov         rcx,rax  
00007FF63EA311EF  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
	cout << sizeof(sp1) << "," << sizeof(sp2) << "," << sizeof(sp3) << endl;
00007FF63EA311F5  mov         edx,8  
00007FF63EA311FA  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA31201  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33080h)]  
00007FF63EA31207  lea         rdx,[std::_Fake_alloc+75h (07FF63EA33420h)]  
00007FF63EA3120E  mov         rcx,rax  
00007FF63EA31211  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA31216  mov         edx,8  
00007FF63EA3121B  mov         rcx,rax  
00007FF63EA3121E  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33080h)]  
00007FF63EA31224  lea         rdx,[std::_Fake_alloc+1h (07FF63EA333ACh)]  
00007FF63EA3122B  mov         rcx,rax  
00007FF63EA3122E  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA31233  mov         edx,1  
00007FF63EA31238  mov         rcx,rax  
00007FF63EA3123B  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33080h)]  
00007FF63EA31241  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA31248  mov         rcx,rax  
00007FF63EA3124B  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
	cout << "end of main" << endl;
00007FF63EA31251  lea         rdx,[std::_Fake_alloc+7Dh (07FF63EA33428h)]  
00007FF63EA31258  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA3125F  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)  
00007FF63EA31264  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF63EA31A30h)]  
00007FF63EA3126B  mov         rcx,rax  
00007FF63EA3126E  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF63EA33088h)]  
00007FF63EA31274  nop  
	delete sp1;
00007FF63EA31275  mov         rax,qword ptr [sp1]  
00007FF63EA3127A  mov         qword ptr [rsp+38h],rax  
00007FF63EA3127F  mov         edx,1  
00007FF63EA31284  mov         rcx,qword ptr [rsp+38h]  
00007FF63EA31289  call        operator delete (07FF63EA31AECh)  
00007FF63EA3128E  cmp         qword ptr [rsp+38h],0  
00007FF63EA31294  jne         main+2A1h (07FF63EA312A1h)  
00007FF63EA31296  mov         qword ptr [rsp+50h],0  
00007FF63EA3129F  jmp         main+2B4h (07FF63EA312B4h)  
00007FF63EA312A1  mov         qword ptr [sp1],8123h  
00007FF63EA312AA  mov         rax,qword ptr [sp1]  
00007FF63EA312AF  mov         qword ptr [rsp+50h],rax  
	free(sp2);
00007FF63EA312B4  mov         rcx,qword ptr [sp2]  
00007FF63EA312B9  call        qword ptr [__imp_free (07FF63EA33140h)]  

	return 0;
00007FF63EA312BF  xor         eax,eax  
}
00007FF63EA312C1  add         rsp,68h  
00007FF63EA312C5  ret

 

* 생성자 인라인 처리됨

00007FF63EA31004  lea         rdx,[string "I'm Simple constructor!" (07FF63EA33390h)]  
00007FF63EA3100B  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA31012  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)
00007FF63EA3119E  lea         rdx,[string "I'm Simple constructor!" (07FF63EA33390h)]  
00007FF63EA311A5  mov         rcx,qword ptr [__imp_std::cout (07FF63EA33090h)]  
00007FF63EA311AC  call        std::operator<<<std::char_traits<char> > (07FF63EA31510h)