* 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 = #
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)
'IT공부 > IT서적' 카테고리의 다른 글
[윤성우 열혈 C++프로그래밍] 어셈블리 코드 - Chapter5, Chapter6 (0) | 2025.04.02 |
---|---|
[윤성우 열혈 C++프로그래밍] 어셈블리 코드 - Chapter3, Chapter4 (0) | 2025.03.29 |
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 21장. Dynamic Linking Library (0) | 2025.03.12 |
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 20장. 메모리 관리 (0) | 2025.03.11 |
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 19장. 비동기 I/O와 APC (0) | 2025.03.01 |