IT공부/IT서적

[윤성우 열혈 C프로그래밍] 디버깅 빌드, 어셈블리 코드 - Chapter11, Chapter12, Chapter13, Chapter14

shine94 2025. 1. 27. 20:40
#include <stdio.h>

int main(void)
{
00631870  push        ebp  
00631871  mov         ebp,esp  
00631873  sub         esp,0F4h  
00631879  push        ebx  
0063187A  push        esi  
0063187B  push        edi  
0063187C  lea         edi,[ebp-34h]  
0063187F  mov         ecx,0Dh  
00631884  mov         eax,0CCCCCCCCh  
00631889  rep stos    dword ptr es:[edi]  
0063188B  mov         ecx,offset _3312D6C9_ArrayAccess@c (063C008h)  
00631890  call        @__CheckForDebuggerJustMyCode@4 (063132Ah)  
00631895  nop  
	int arr[5];
	int sum = 0, i;
00631896  mov         dword ptr [sum],0  

	arr[0] = 10, arr[1] = 20, arr[2] = 30, arr[3] = 40, arr[4] = 50;
0063189D  mov         eax,4  
006318A2  imul        ecx,eax,0  
006318A5  mov         dword ptr arr[ecx],0Ah  
006318AD  mov         edx,4  
006318B2  shl         edx,0  
006318B5  mov         dword ptr arr[edx],14h  
006318BD  mov         eax,4  
006318C2  shl         eax,1  
006318C4  mov         dword ptr arr[eax],1Eh  
006318CC  mov         ecx,4  
006318D1  imul        edx,ecx,3  
006318D4  mov         dword ptr arr[edx],28h  
006318DC  mov         eax,4  
006318E1  shl         eax,2  
006318E4  mov         dword ptr arr[eax],32h  

	for (i = 0; i < 5; i++)
006318EC  mov         dword ptr [i],0  
006318F3  jmp         __$EncStackInitStart+82h (06318FEh)  
006318F5  mov         eax,dword ptr [i]  
006318F8  add         eax,1  
006318FB  mov         dword ptr [i],eax  
006318FE  cmp         dword ptr [i],5  
00631902  jge         __$EncStackInitStart+97h (0631913h)  
		sum += arr[i];
00631904  mov         eax,dword ptr [i]  
00631907  mov         ecx,dword ptr [sum]  
0063190A  add         ecx,dword ptr arr[eax*4]  
0063190E  mov         dword ptr [sum],ecx  
00631911  jmp         __$EncStackInitStart+79h (06318F5h)  

	printf("배열요소에 저장된 값의 합 : %d", sum);
00631913  mov         eax,dword ptr [sum]  
00631916  push        eax  
00631917  push        offset string "\xb9\xe8\xbf\xad\xbf\xe4\xbc\xd2\xbf\xa1 \xc0\xfa\xc0\xe5\xb5\xc8 \xb0\xaa\xc0\xc7 \xc7\xd5 : %d" (0637B30h)  
0063191C  call        _printf (06310D2h)  
00631921  add         esp,8  

	return 0;
00631924  xor         eax,eax  
}
00631926  push        edx  
00631927  mov         ecx,ebp  
00631929  push        eax  
0063192A  lea         edx,ds:[63194Ch]  
00631930  call        @_RTC_CheckStackVars@8 (06311EAh)  
00631935  pop         eax  
00631936  pop         edx  
00631937  pop         edi  
00631938  pop         esi  
00631939  pop         ebx  
0063193A  add         esp,0F4h  
00631940  cmp         ebp,esp  
00631942  call        __RTC_CheckEsp (063124Eh)  
00631947  mov         esp,ebp  
00631949  pop         ebp  
0063194A  ret

 

#include <stdio.h>

int main(void)
{
00007FF61E4B1890  push        rbp  
00007FF61E4B1892  push        rdi  
00007FF61E4B1893  sub         rsp,158h  
00007FF61E4B189A  lea         rbp,[rsp+20h]  
00007FF61E4B189F  lea         rdi,[rsp+20h]  
00007FF61E4B18A4  mov         ecx,1Eh  
00007FF61E4B18A9  mov         eax,0CCCCCCCCh  
00007FF61E4B18AE  rep stos    dword ptr [rdi]  
00007FF61E4B18B0  lea         rcx,[__3312D6C9_ArrayAccess@c (07FF61E4C2008h)]  
00007FF61E4B18B7  call        __CheckForDebuggerJustMyCode (07FF61E4B136Bh)  
00007FF61E4B18BC  nop  
	int arr[5];
	int sum = 0, i;
00007FF61E4B18BD  mov         dword ptr [sum],0  

	arr[0] = 10, arr[1] = 20, arr[2] = 30, arr[3] = 40, arr[4] = 50;
00007FF61E4B18C4  mov         eax,4  
00007FF61E4B18C9  imul        rax,rax,0  
00007FF61E4B18CD  mov         dword ptr arr[rax],0Ah  
00007FF61E4B18D5  mov         eax,4  
00007FF61E4B18DA  imul        rax,rax,1  
00007FF61E4B18DE  mov         dword ptr arr[rax],14h  
00007FF61E4B18E6  mov         eax,4  
00007FF61E4B18EB  imul        rax,rax,2  
00007FF61E4B18EF  mov         dword ptr arr[rax],1Eh  
00007FF61E4B18F7  mov         eax,4  
00007FF61E4B18FC  imul        rax,rax,3  
00007FF61E4B1900  mov         dword ptr arr[rax],28h  
00007FF61E4B1908  mov         eax,4  
00007FF61E4B190D  imul        rax,rax,4  
00007FF61E4B1911  mov         dword ptr arr[rax],32h  

	for (i = 0; i < 5; i++)
00007FF61E4B1919  mov         dword ptr [i],0  
00007FF61E4B1920  jmp         __$EncStackInitStart+8Bh (07FF61E4B192Ah)  
00007FF61E4B1922  mov         eax,dword ptr [i]  
00007FF61E4B1925  inc         eax  
00007FF61E4B1927  mov         dword ptr [i],eax  
00007FF61E4B192A  cmp         dword ptr [i],5  
00007FF61E4B192E  jge         __$EncStackInitStart+0A5h (07FF61E4B1944h)  
		sum += arr[i];
00007FF61E4B1930  movsxd      rax,dword ptr [i]  
00007FF61E4B1934  mov         eax,dword ptr arr[rax*4]  
00007FF61E4B1938  mov         ecx,dword ptr [sum]  
00007FF61E4B193B  add         ecx,eax  
00007FF61E4B193D  mov         eax,ecx  
00007FF61E4B193F  mov         dword ptr [sum],eax  
00007FF61E4B1942  jmp         __$EncStackInitStart+83h (07FF61E4B1922h)  

	printf("배열요소에 저장된 값의 합 : %d", sum);
00007FF61E4B1944  mov         edx,dword ptr [sum]  
00007FF61E4B1947  lea         rcx,[string "\xb9\xe8\xbf\xad\xbf\xe4\xbc\xd2\xbf\xa1 \xc0\xfa\xc0\xe5\xb5\xc8 \xb0\xaa\xc0\xc7 \xc7\xd5 : %d" (07FF61E4BACA8h)]  
00007FF61E4B194E  call        printf (07FF61E4B1195h)  
00007FF61E4B1953  nop  

	return 0;
00007FF61E4B1954  xor         eax,eax  
}
00007FF61E4B1956  mov         edi,eax  
00007FF61E4B1958  lea         rcx,[rbp-20h]  
00007FF61E4B195C  lea         rdx,[__xt_z+1E0h (07FF61E4BAC80h)]  
00007FF61E4B1963  call        _RTC_CheckStackVars (07FF61E4B1307h)  
00007FF61E4B1968  mov         eax,edi  
00007FF61E4B196A  lea         rsp,[rbp+138h]  
00007FF61E4B1971  pop         rdi  
00007FF61E4B1972  pop         rbp  
00007FF61E4B1973  ret

 


 

#include <stdio.h>

int main(void)
{
00B11870  push        ebp  
00B11871  mov         ebp,esp  
00B11873  sub         esp,0DCh  
00B11879  push        ebx  
00B1187A  push        esi  
00B1187B  push        edi  
00B1187C  lea         edi,[ebp-1Ch]  
00B1187F  mov         ecx,7  
00B11884  mov         eax,0CCCCCCCCh  
00B11889  rep stos    dword ptr es:[edi]  
00B1188B  mov         eax,dword ptr [__security_cookie (0B1A000h)]  
00B11890  xor         eax,ebp  
00B11892  mov         dword ptr [ebp-4],eax  
00B11895  mov         ecx,offset _1BD3FA0E_ArrayString@c (0B1C008h)  
00B1189A  call        @__CheckForDebuggerJustMyCode@4 (0B1132Ah)  
00B1189F  nop  
	char str[] = "Good morning!";
00B118A0  mov         eax,dword ptr [string "Good morning!" (0B17B30h)]  
00B118A5  mov         dword ptr [str],eax  
00B118A8  mov         ecx,dword ptr ds:[0B17B34h]  
00B118AE  mov         dword ptr [ebp-14h],ecx  
00B118B1  mov         edx,dword ptr ds:[0B17B38h]  
00B118B7  mov         dword ptr [ebp-10h],edx  
00B118BA  mov         ax,word ptr ds:[00B17B3Ch]  
00B118C0  mov         word ptr [ebp-0Ch],ax  
	printf("배열 str의 크기: %d\n", (int)sizeof(str));
00B118C4  push        0Eh  
00B118C6  push        offset string "\xb9\xe8\xbf\xad str\xc0\xc7 \xc5\xa9\xb1\xe2: %d\n" (0B17B40h)  
00B118CB  call        _printf (0B110D2h)  
00B118D0  add         esp,8  
	printf("널 문자 문자형 출력: %c\n", str[13]);
00B118D3  mov         eax,1  
00B118D8  imul        ecx,eax,0Dh  
00B118DB  movsx       edx,byte ptr str[ecx]  
00B118E0  push        edx  
00B118E1  push        offset string "\xb3\xce \xb9\xae\xc0\xda \xb9\xae\xc0\xda\xc7\xfc \xc3\xe2\xb7\xc2: %c\n" (0B17B5Ch)  
00B118E6  call        _printf (0B110D2h)  
00B118EB  add         esp,8  
	printf("널 문자 정수형 출력: %d\n", str[13]);
00B118EE  mov         eax,1  
00B118F3  imul        ecx,eax,0Dh  
00B118F6  movsx       edx,byte ptr str[ecx]  
00B118FB  push        edx  
00B118FC  push        offset string "\xb3\xce \xb9\xae\xc0\xda \xc1\xa4\xbc\xf6\xc7\xfc \xc3\xe2\xb7\xc2: %d\n" (0B17B7Ch)  
00B11901  call        _printf (0B110D2h)  
00B11906  add         esp,8  

	str[12] = '?';		// 배열 str에 저장된 문자열 데이터는 변경 가능!
00B11909  mov         eax,1  
00B1190E  imul        ecx,eax,0Ch  
00B11911  mov         byte ptr str[ecx],3Fh  
	printf("문자열 출력 : %s\n", str);
00B11916  lea         eax,[str]  
00B11919  push        eax  
00B1191A  push        offset string "\xb9\xae\xc0\xda\xbf\xad \xc3\xe2\xb7\xc2 : %s\n" (0B17B9Ch)  
00B1191F  call        _printf (0B110D2h)  
00B11924  add         esp,8  

	return 0;
00B11927  xor         eax,eax  
}
00B11929  push        edx  
00B1192A  mov         ecx,ebp  
00B1192C  push        eax  
00B1192D  lea         edx,ds:[0B11958h]  
00B11933  call        @_RTC_CheckStackVars@8 (0B111EAh)  
00B11938  pop         eax  
00B11939  pop         edx  
00B1193A  pop         edi  
00B1193B  pop         esi  
00B1193C  pop         ebx  
00B1193D  mov         ecx,dword ptr [ebp-4]  
00B11940  xor         ecx,ebp  
00B11942  call        @__security_check_cookie@4 (0B1114Fh)  
00B11947  add         esp,0DCh  
00B1194D  cmp         ebp,esp  
00B1194F  call        __RTC_CheckEsp (0B1124Eh)  
00B11954  mov         esp,ebp  
00B11956  pop         ebp  
00B11957  ret

 

#include <stdio.h>

int main(void)
{
00007FF6F0ED1890  push        rbp  
00007FF6F0ED1892  push        rsi  
00007FF6F0ED1893  push        rdi  
00007FF6F0ED1894  sub         rsp,110h  
00007FF6F0ED189B  lea         rbp,[rsp+20h]  
00007FF6F0ED18A0  lea         rdi,[rsp+20h]  
00007FF6F0ED18A5  mov         ecx,0Ch  
00007FF6F0ED18AA  mov         eax,0CCCCCCCCh  
00007FF6F0ED18AF  rep stos    dword ptr [rdi]  
00007FF6F0ED18B1  mov         rax,qword ptr [__security_cookie (07FF6F0EDD000h)]  
00007FF6F0ED18B8  xor         rax,rbp  
00007FF6F0ED18BB  mov         qword ptr [rbp+0E8h],rax  
00007FF6F0ED18C2  lea         rcx,[__1BD3FA0E_ArrayString@c (07FF6F0EE2008h)]  
00007FF6F0ED18C9  call        __CheckForDebuggerJustMyCode (07FF6F0ED136Bh)  
00007FF6F0ED18CE  nop  
	char str[] = "Good morning!";
00007FF6F0ED18CF  lea         rax,[str]  
00007FF6F0ED18D3  lea         rcx,[string "Good morning!" (07FF6F0EDACA8h)]  
00007FF6F0ED18DA  mov         rdi,rax  
00007FF6F0ED18DD  mov         rsi,rcx  
00007FF6F0ED18E0  mov         ecx,0Eh  
00007FF6F0ED18E5  rep movs    byte ptr [rdi],byte ptr [rsi]  
	printf("배열 str의 크기: %d\n", (int)sizeof(str));
00007FF6F0ED18E7  mov         edx,0Eh  
00007FF6F0ED18EC  lea         rcx,[string "\xb9\xe8\xbf\xad str\xc0\xc7 \xc5\xa9\xb1\xe2: %d\n" (07FF6F0EDACB8h)]  
00007FF6F0ED18F3  call        printf (07FF6F0ED1195h)  
00007FF6F0ED18F8  nop  
	printf("널 문자 문자형 출력: %c\n", str[13]);
00007FF6F0ED18F9  mov         eax,1  
00007FF6F0ED18FE  imul        rax,rax,0Dh  
00007FF6F0ED1902  movsx       eax,byte ptr str[rax]  
00007FF6F0ED1907  mov         edx,eax  
00007FF6F0ED1909  lea         rcx,[string "\xb3\xce \xb9\xae\xc0\xda \xb9\xae\xc0\xda\xc7\xfc \xc3\xe2\xb7\xc2: %c\n" (07FF6F0EDACD8h)]  
00007FF6F0ED1910  call        printf (07FF6F0ED1195h)  
00007FF6F0ED1915  nop  
	printf("널 문자 정수형 출력: %d\n", str[13]);
00007FF6F0ED1916  mov         eax,1  
00007FF6F0ED191B  imul        rax,rax,0Dh  
00007FF6F0ED191F  movsx       eax,byte ptr str[rax]  
00007FF6F0ED1924  mov         edx,eax  
00007FF6F0ED1926  lea         rcx,[string "\xb3\xce \xb9\xae\xc0\xda \xc1\xa4\xbc\xf6\xc7\xfc \xc3\xe2\xb7\xc2: %d\n" (07FF6F0EDACF8h)]  
00007FF6F0ED192D  call        printf (07FF6F0ED1195h)  
00007FF6F0ED1932  nop  

	str[12] = '?';		// 배열 str에 저장된 문자열 데이터는 변경 가능!
00007FF6F0ED1933  mov         eax,1  
00007FF6F0ED1938  imul        rax,rax,0Ch  
00007FF6F0ED193C  mov         byte ptr str[rax],3Fh  
	printf("문자열 출력 : %s\n", str);
00007FF6F0ED1941  lea         rdx,[str]  
00007FF6F0ED1945  lea         rcx,[string "\xb9\xae\xc0\xda\xbf\xad \xc3\xe2\xb7\xc2 : %s\n" (07FF6F0EDAD18h)]  
00007FF6F0ED194C  call        printf (07FF6F0ED1195h)  
00007FF6F0ED1951  nop  

	return 0;
00007FF6F0ED1952  xor         eax,eax  
}
00007FF6F0ED1954  mov         edi,eax  
00007FF6F0ED1956  lea         rcx,[rbp-20h]  
00007FF6F0ED195A  lea         rdx,[__xt_z+1E0h (07FF6F0EDAC80h)]  
00007FF6F0ED1961  call        _RTC_CheckStackVars (07FF6F0ED1307h)  
00007FF6F0ED1966  mov         eax,edi  
00007FF6F0ED1968  mov         rcx,qword ptr [rbp+0E8h]  
00007FF6F0ED196F  xor         rcx,rbp  
00007FF6F0ED1972  call        __security_check_cookie (07FF6F0ED11AEh)  
00007FF6F0ED1977  lea         rsp,[rbp+0F0h]  
00007FF6F0ED197E  pop         rdi  
00007FF6F0ED197F  pop         rsi  
00007FF6F0ED1980  pop         rbp  
00007FF6F0ED1981  ret

 


 

#include <stdio.h>
#include <windows.h>

int main(void)
{
00661960  push        ebp  
00661961  mov         ebp,esp  
00661963  sub         esp,10Ch  
00661969  push        ebx  
0066196A  push        esi  
0066196B  push        edi  
0066196C  lea         edi,[ebp-4Ch]  
0066196F  mov         ecx,13h  
00661974  mov         eax,0CCCCCCCCh  
00661979  rep stos    dword ptr es:[edi]  
0066197B  mov         eax,dword ptr [__security_cookie (066A000h)]  
00661980  xor         eax,ebp  
00661982  mov         dword ptr [ebp-4],eax  
00661985  mov         ecx,offset _B00F1283_ReadString@c (066C0A2h)  
0066198A  call        @__CheckForDebuggerJustMyCode@4 (0661339h)  
0066198F  nop  
	char str[50];
	int idx = 0;
00661990  mov         dword ptr [idx],0  

	printf("문자열 입력: ");
00661997  push        offset string "\xb9\xae\xc0\xda\xbf\xad \xc0\xd4\xb7\xc2: " (0667B30h)  
0066199C  call        _printf (06610DCh)  
006619A1  add         esp,4  
	scanf_s("%s", str, (unsigned int)_countof(str));		// 문자열을 입력 받아서 배열 str에 저장
006619A4  push        32h  
006619A6  lea         eax,[str]  
006619A9  push        eax  
006619AA  push        offset string "%s" (0667B40h)  
006619AF  call        _scanf_s (0661294h)  
006619B4  add         esp,0Ch  

	printf("문자 단위 출력: ");
006619B7  push        offset string "\xb9\xae\xc0\xda \xb4\xdc\xc0\xa7 \xc3\xe2\xb7\xc2: " (0667B44h)  
006619BC  call        _printf (06610DCh)  
006619C1  add         esp,4  
	while (str[idx] != '\0')	// 문자열 끝까지 출력
006619C4  mov         eax,dword ptr [idx]  
006619C7  movsx       ecx,byte ptr str[eax]  
006619CC  test        ecx,ecx  
006619CE  je          __$EncStackInitStart+85h (06619F1h)  
	{
		printf("%c", str[idx]);
006619D0  mov         eax,dword ptr [idx]  
006619D3  movsx       ecx,byte ptr str[eax]  
006619D8  push        ecx  
006619D9  push        offset string "%c" (0667B58h)  
006619DE  call        _printf (06610DCh)  
006619E3  add         esp,8  
		idx++;
006619E6  mov         eax,dword ptr [idx]  
006619E9  add         eax,1  
006619EC  mov         dword ptr [idx],eax  
	}
006619EF  jmp         __$EncStackInitStart+58h (06619C4h)  
	printf("\n");
006619F1  push        offset string "\n" (0667B5Ch)  
006619F6  call        _printf (06610DCh)  
006619FB  add         esp,4  

	return 0;
006619FE  xor         eax,eax  
}
00661A00  push        edx  
00661A01  mov         ecx,ebp  
00661A03  push        eax  
00661A04  lea         edx,ds:[661A30h]  
00661A0A  call        @_RTC_CheckStackVars@8 (06611F4h)  
00661A0F  pop         eax  
00661A10  pop         edx  
00661A11  pop         edi  
00661A12  pop         esi  
00661A13  pop         ebx  
00661A14  mov         ecx,dword ptr [ebp-4]  
00661A17  xor         ecx,ebp  
00661A19  call        @__security_check_cookie@4 (0661159h)  
00661A1E  add         esp,10Ch  
00661A24  cmp         ebp,esp  
00661A26  call        __RTC_CheckEsp (0661258h)  
00661A2B  mov         esp,ebp  
00661A2D  pop         ebp  
00661A2E  ret

 

#include <stdio.h>
#include <windows.h>

int main(void)
{
00007FF70D621980  push        rbp  
00007FF70D621982  push        rdi  
00007FF70D621983  sub         rsp,158h  
00007FF70D62198A  lea         rbp,[rsp+20h]  
00007FF70D62198F  lea         rdi,[rsp+20h]  
00007FF70D621994  mov         ecx,1Eh  
00007FF70D621999  mov         eax,0CCCCCCCCh  
00007FF70D62199E  rep stos    dword ptr [rdi]  
00007FF70D6219A0  mov         rax,qword ptr [__security_cookie (07FF70D62D000h)]  
00007FF70D6219A7  xor         rax,rbp  
00007FF70D6219AA  mov         qword ptr [rbp+128h],rax  
00007FF70D6219B1  lea         rcx,[__B00F1283_ReadString@c (07FF70D6320A2h)]  
00007FF70D6219B8  call        __CheckForDebuggerJustMyCode (07FF70D62137Ah)  
00007FF70D6219BD  nop  
	char str[50];
	int idx = 0;
00007FF70D6219BE  mov         dword ptr [idx],0  

	printf("문자열 입력: ");
00007FF70D6219C5  lea         rcx,[string "\xb9\xae\xc0\xda\xbf\xad \xc0\xd4\xb7\xc2: " (07FF70D62AD28h)]  
00007FF70D6219CC  call        printf (07FF70D62119Ah)  
00007FF70D6219D1  nop  
	scanf_s("%s", str, (unsigned int)_countof(str));		// 문자열을 입력 받아서 배열 str에 저장
00007FF70D6219D2  mov         r8d,32h  
00007FF70D6219D8  lea         rdx,[str]  
00007FF70D6219DC  lea         rcx,[string "%s" (07FF70D62AD38h)]  
00007FF70D6219E3  call        scanf_s (07FF70D621203h)  
00007FF70D6219E8  nop  

	printf("문자 단위 출력: ");
00007FF70D6219E9  lea         rcx,[string "\xb9\xae\xc0\xda \xb4\xdc\xc0\xa7 \xc3\xe2\xb7\xc2: " (07FF70D62AD40h)]  
00007FF70D6219F0  call        printf (07FF70D62119Ah)  
00007FF70D6219F5  nop  
	while (str[idx] != '\0')	// 문자열 끝까지 출력
00007FF70D6219F6  movsxd      rax,dword ptr [idx]  
00007FF70D6219FA  movsx       eax,byte ptr str[rax]  
00007FF70D6219FF  test        eax,eax  
00007FF70D621A01  je          __$EncStackInitStart+96h (07FF70D621A25h)  
	{
		printf("%c", str[idx]);
00007FF70D621A03  movsxd      rax,dword ptr [idx]  
00007FF70D621A07  movsx       eax,byte ptr str[rax]  
00007FF70D621A0C  mov         edx,eax  
00007FF70D621A0E  lea         rcx,[string "%c" (07FF70D62AD54h)]  
00007FF70D621A15  call        printf (07FF70D62119Ah)  
00007FF70D621A1A  nop  
		idx++;
00007FF70D621A1B  mov         eax,dword ptr [idx]  
00007FF70D621A1E  inc         eax  
00007FF70D621A20  mov         dword ptr [idx],eax  
	}
00007FF70D621A23  jmp         __$EncStackInitStart+67h (07FF70D6219F6h)  
	printf("\n");
00007FF70D621A25  lea         rcx,[string "\n" (07FF70D62AD58h)]  
00007FF70D621A2C  call        printf (07FF70D62119Ah)  
00007FF70D621A31  nop  

	return 0;
00007FF70D621A32  xor         eax,eax  
}
00007FF70D621A34  mov         edi,eax  
00007FF70D621A36  lea         rcx,[rbp-20h]  
00007FF70D621A3A  lea         rdx,[__xt_z+260h (07FF70D62AD00h)]  
00007FF70D621A41  call        _RTC_CheckStackVars (07FF70D621316h)  
00007FF70D621A46  mov         eax,edi  
00007FF70D621A48  mov         rcx,qword ptr [rbp+128h]  
00007FF70D621A4F  xor         rcx,rbp  
00007FF70D621A52  call        __security_check_cookie (07FF70D6211B3h)  
00007FF70D621A57  lea         rsp,[rbp+138h]  
00007FF70D621A5E  pop         rdi  
00007FF70D621A5F  pop         rbp  
00007FF70D621A60  ret

 

* x86 64비트 rcx, rdx, r8d 레지스터를 이용해 매개변수 전달

 

* 널 문자의 아스키 코드 값은 0

   따라서, '\0'0 둘 다 널 문자이다

 


 

#include <stdio.h>

int main(void)
{
00821870  push        ebp  
00821871  mov         ebp,esp  
00821873  sub         esp,0E8h  
00821879  push        ebx  
0082187A  push        esi  
0082187B  push        edi  
0082187C  lea         edi,[ebp-28h]  
0082187F  mov         ecx,0Ah  
00821884  mov         eax,0CCCCCCCCh  
00821889  rep stos    dword ptr es:[edi]  
0082188B  mov         eax,dword ptr [__security_cookie (082A000h)]  
00821890  xor         eax,ebp  
00821892  mov         dword ptr [ebp-4],eax  
00821895  mov         ecx,offset _EB6AFEA5_PointerOperation@c (082C008h)  
0082189A  call        @__CheckForDebuggerJustMyCode@4 (082132Ah)  
0082189F  nop  
	int num1 = 100, num2 = 100;
008218A0  mov         dword ptr [num1],64h  
008218A7  mov         dword ptr [num2],64h  
	int* pnum;

	pnum = &num1;
008218AE  lea         eax,[num1]  
008218B1  mov         dword ptr [pnum],eax  
	(*pnum) += 30;
008218B4  mov         eax,dword ptr [pnum]  
008218B7  mov         ecx,dword ptr [eax]  
008218B9  add         ecx,1Eh  
008218BC  mov         edx,dword ptr [pnum]  
008218BF  mov         dword ptr [edx],ecx  

	pnum = &num2;
008218C1  lea         eax,[num2]  
008218C4  mov         dword ptr [pnum],eax  
	(*pnum) -= 30;
008218C7  mov         eax,dword ptr [pnum]  
008218CA  mov         ecx,dword ptr [eax]  
008218CC  sub         ecx,1Eh  
008218CF  mov         edx,dword ptr [pnum]  
008218D2  mov         dword ptr [edx],ecx  

	printf("num1: %d, num2: %d\n", num1, num2);
008218D4  mov         eax,dword ptr [num2]  
008218D7  push        eax  
008218D8  mov         ecx,dword ptr [num1]  
008218DB  push        ecx  
008218DC  push        offset string "num1: %d, num2: %d\n" (0827B30h)  
008218E1  call        _printf (08210D2h)  
008218E6  add         esp,0Ch  

	return 0;
008218E9  xor         eax,eax  
}
008218EB  push        edx  
008218EC  mov         ecx,ebp  
008218EE  push        eax  
008218EF  lea         edx,ds:[82191Ch]  
008218F5  call        @_RTC_CheckStackVars@8 (08211EAh)  
008218FA  pop         eax  
008218FB  pop         edx  
008218FC  pop         edi  
008218FD  pop         esi  
008218FE  pop         ebx  
008218FF  mov         ecx,dword ptr [ebp-4]  
00821902  xor         ecx,ebp  
00821904  call        @__security_check_cookie@4 (082114Fh)  
00821909  add         esp,0E8h  
0082190F  cmp         ebp,esp  
00821911  call        __RTC_CheckEsp (082124Eh)  
00821916  mov         esp,ebp  
00821918  pop         ebp  
00821919  ret

 

#include <stdio.h>

int main(void)
{
00007FF663F41890  push        rbp  
00007FF663F41892  push        rdi  
00007FF663F41893  sub         rsp,148h  
00007FF663F4189A  lea         rbp,[rsp+20h]  
00007FF663F4189F  lea         rdi,[rsp+20h]  
00007FF663F418A4  mov         ecx,1Ah  
00007FF663F418A9  mov         eax,0CCCCCCCCh  
00007FF663F418AE  rep stos    dword ptr [rdi]  
00007FF663F418B0  mov         rax,qword ptr [__security_cookie (07FF663F4D000h)]  
00007FF663F418B7  xor         rax,rbp  
00007FF663F418BA  mov         qword ptr [rbp+118h],rax  
00007FF663F418C1  lea         rcx,[__EB6AFEA5_PointerOperation@c (07FF663F52008h)]  
00007FF663F418C8  call        __CheckForDebuggerJustMyCode (07FF663F4136Bh)  
00007FF663F418CD  nop  
	int num1 = 100, num2 = 100;
00007FF663F418CE  mov         dword ptr [num1],64h  
00007FF663F418D5  mov         dword ptr [num2],64h  
	int* pnum;

	pnum = &num1;
00007FF663F418DC  lea         rax,[num1]  
00007FF663F418E0  mov         qword ptr [pnum],rax  
	(*pnum) += 30;
00007FF663F418E4  mov         rax,qword ptr [pnum]  
00007FF663F418E8  mov         eax,dword ptr [rax]  
00007FF663F418EA  add         eax,1Eh  
00007FF663F418ED  mov         rcx,qword ptr [pnum]  
00007FF663F418F1  mov         dword ptr [rcx],eax  

	pnum = &num2;
00007FF663F418F3  lea         rax,[num2]  
00007FF663F418F7  mov         qword ptr [pnum],rax  
	(*pnum) -= 30;
00007FF663F418FB  mov         rax,qword ptr [pnum]  
00007FF663F418FF  mov         eax,dword ptr [rax]  
00007FF663F41901  sub         eax,1Eh  
00007FF663F41904  mov         rcx,qword ptr [pnum]  
00007FF663F41908  mov         dword ptr [rcx],eax  

	printf("num1: %d, num2: %d\n", num1, num2);
00007FF663F4190A  mov         r8d,dword ptr [num2]  
00007FF663F4190E  mov         edx,dword ptr [num1]  
00007FF663F41911  lea         rcx,[string "num1: %d, num2: %d\n" (07FF663F4ACF0h)]  
00007FF663F41918  call        printf (07FF663F41195h)  
00007FF663F4191D  nop  

	return 0;
00007FF663F4191E  xor         eax,eax  
}
00007FF663F41920  mov         edi,eax  
00007FF663F41922  lea         rcx,[rbp-20h]  
00007FF663F41926  lea         rdx,[__xt_z+220h (07FF663F4ACC0h)]  
00007FF663F4192D  call        _RTC_CheckStackVars (07FF663F41307h)  
00007FF663F41932  mov         eax,edi  
00007FF663F41934  mov         rcx,qword ptr [rbp+118h]  
00007FF663F4193B  xor         rcx,rbp  
00007FF663F4193E  call        __security_check_cookie (07FF663F411AEh)  
00007FF663F41943  lea         rsp,[rbp+128h]  
00007FF663F4194A  pop         rdi  
00007FF663F4194B  pop         rbp  
00007FF663F4194C  ret

 


 

* 배열의 이름은 포인터, 그 값을 바꿀 수 없는 상수 형태의 포인터

 

#include <stdio.h>

int main(void)
{
00821870  push        ebp  
00821871  mov         ebp,esp  
00821873  sub         esp,0E8h  
00821879  push        ebx  
0082187A  push        esi  
0082187B  push        edi  
0082187C  lea         edi,[ebp-28h]  
0082187F  mov         ecx,0Ah  
00821884  mov         eax,0CCCCCCCCh  
00821889  rep stos    dword ptr es:[edi]  
0082188B  mov         eax,dword ptr [__security_cookie (082A000h)]  
00821890  xor         eax,ebp  
00821892  mov         dword ptr [ebp-4],eax  
00821895  mov         ecx,offset _EB6AFEA5_PointerOperation@c (082C008h)  
0082189A  call        @__CheckForDebuggerJustMyCode@4 (082132Ah)  
0082189F  nop  
	int num1 = 100, num2 = 100;
008218A0  mov         dword ptr [num1],64h  
008218A7  mov         dword ptr [num2],64h  
	int* pnum;

	pnum = &num1;
008218AE  lea         eax,[num1]  
008218B1  mov         dword ptr [pnum],eax  
	(*pnum) += 30;
008218B4  mov         eax,dword ptr [pnum]  
008218B7  mov         ecx,dword ptr [eax]  
008218B9  add         ecx,1Eh  
008218BC  mov         edx,dword ptr [pnum]  
008218BF  mov         dword ptr [edx],ecx  

	pnum = &num2;
008218C1  lea         eax,[num2]  
008218C4  mov         dword ptr [pnum],eax  
	(*pnum) -= 30;
008218C7  mov         eax,dword ptr [pnum]  
008218CA  mov         ecx,dword ptr [eax]  
008218CC  sub         ecx,1Eh  
008218CF  mov         edx,dword ptr [pnum]  
008218D2  mov         dword ptr [edx],ecx  

	printf("num1: %d, num2: %d\n", num1, num2);
008218D4  mov         eax,dword ptr [num2]  
008218D7  push        eax  
008218D8  mov         ecx,dword ptr [num1]  
008218DB  push        ecx  
008218DC  push        offset string "num1: %d, num2: %d\n" (0827B30h)  
008218E1  call        _printf (08210D2h)  
008218E6  add         esp,0Ch  

	return 0;
008218E9  xor         eax,eax  
}
008218EB  push        edx  
008218EC  mov         ecx,ebp  
008218EE  push        eax  
008218EF  lea         edx,ds:[82191Ch]  
008218F5  call        @_RTC_CheckStackVars@8 (08211EAh)  
008218FA  pop         eax  
008218FB  pop         edx  
008218FC  pop         edi  
008218FD  pop         esi  
008218FE  pop         ebx  
008218FF  mov         ecx,dword ptr [ebp-4]  
00821902  xor         ecx,ebp  
00821904  call        @__security_check_cookie@4 (082114Fh)  
00821909  add         esp,0E8h  
0082190F  cmp         ebp,esp  
00821911  call        __RTC_CheckEsp (082124Eh)  
00821916  mov         esp,ebp  
00821918  pop         ebp  
00821919  ret

 

#include <stdio.h>

int main(void)
{
00007FF663F41890  push        rbp  
00007FF663F41892  push        rdi  
00007FF663F41893  sub         rsp,148h  
00007FF663F4189A  lea         rbp,[rsp+20h]  
00007FF663F4189F  lea         rdi,[rsp+20h]  
00007FF663F418A4  mov         ecx,1Ah  
00007FF663F418A9  mov         eax,0CCCCCCCCh  
00007FF663F418AE  rep stos    dword ptr [rdi]  
00007FF663F418B0  mov         rax,qword ptr [__security_cookie (07FF663F4D000h)]  
00007FF663F418B7  xor         rax,rbp  
00007FF663F418BA  mov         qword ptr [rbp+118h],rax  
00007FF663F418C1  lea         rcx,[__EB6AFEA5_PointerOperation@c (07FF663F52008h)]  
00007FF663F418C8  call        __CheckForDebuggerJustMyCode (07FF663F4136Bh)  
00007FF663F418CD  nop  
	int num1 = 100, num2 = 100;
00007FF663F418CE  mov         dword ptr [num1],64h  
00007FF663F418D5  mov         dword ptr [num2],64h  
	int* pnum;

	pnum = &num1;
00007FF663F418DC  lea         rax,[num1]  
00007FF663F418E0  mov         qword ptr [pnum],rax  
	(*pnum) += 30;
00007FF663F418E4  mov         rax,qword ptr [pnum]  
00007FF663F418E8  mov         eax,dword ptr [rax]  
00007FF663F418EA  add         eax,1Eh  
00007FF663F418ED  mov         rcx,qword ptr [pnum]  
00007FF663F418F1  mov         dword ptr [rcx],eax  

	pnum = &num2;
00007FF663F418F3  lea         rax,[num2]  
00007FF663F418F7  mov         qword ptr [pnum],rax  
	(*pnum) -= 30;
00007FF663F418FB  mov         rax,qword ptr [pnum]  
00007FF663F418FF  mov         eax,dword ptr [rax]  
00007FF663F41901  sub         eax,1Eh  
00007FF663F41904  mov         rcx,qword ptr [pnum]  
00007FF663F41908  mov         dword ptr [rcx],eax  

	printf("num1: %d, num2: %d\n", num1, num2);
00007FF663F4190A  mov         r8d,dword ptr [num2]  
00007FF663F4190E  mov         edx,dword ptr [num1]  
00007FF663F41911  lea         rcx,[string "num1: %d, num2: %d\n" (07FF663F4ACF0h)]  
00007FF663F41918  call        printf (07FF663F41195h)  
00007FF663F4191D  nop  

	return 0;
00007FF663F4191E  xor         eax,eax  
}
00007FF663F41920  mov         edi,eax  
00007FF663F41922  lea         rcx,[rbp-20h]  
00007FF663F41926  lea         rdx,[__xt_z+220h (07FF663F4ACC0h)]  
00007FF663F4192D  call        _RTC_CheckStackVars (07FF663F41307h)  
00007FF663F41932  mov         eax,edi  
00007FF663F41934  mov         rcx,qword ptr [rbp+118h]  
00007FF663F4193B  xor         rcx,rbp  
00007FF663F4193E  call        __security_check_cookie (07FF663F411AEh)  
00007FF663F41943  lea         rsp,[rbp+128h]  
00007FF663F4194A  pop         rdi  
00007FF663F4194B  pop         rbp  
00007FF663F4194C  ret

 

* qword

   8바이트

 

 


 

#include <stdio.h>

int main(void)
{
00721870  push        ebp  
00721871  mov         ebp,esp  
00721873  sub         esp,0F4h  
00721879  push        ebx  
0072187A  push        esi  
0072187B  push        edi  
0072187C  lea         edi,[ebp-34h]  
0072187F  mov         ecx,0Dh  
00721884  mov         eax,0CCCCCCCCh  
00721889  rep stos    dword ptr es:[edi]  
0072188B  mov         ecx,offset _C409E4C8_ArrqyNamePointerOperation@c (072C008h)  
00721890  call        @__CheckForDebuggerJustMyCode@4 (072132Ah)  
00721895  nop  
	int arr1[3] = { 1, 2, 3 };
00721896  mov         dword ptr [arr1],1  
0072189D  mov         dword ptr [ebp-0Ch],2  
007218A4  mov         dword ptr [ebp-8],3  
	double arr2[3] = { 1.1,2.2,3.3 };
007218AB  movsd       xmm0,mmword ptr [__real@3ff199999999999a (0727B38h)]  
007218B3  movsd       mmword ptr [arr2],xmm0  
007218B8  movsd       xmm0,mmword ptr [__real@400199999999999a (0727B48h)]  
007218C0  movsd       mmword ptr [ebp-28h],xmm0  
007218C5  movsd       xmm0,mmword ptr [__real@400a666666666666 (0727B58h)]  
007218CD  movsd       mmword ptr [ebp-20h],xmm0  

	printf("%d %g\n", *arr1, *arr2);
007218D2  mov         eax,8  
007218D7  imul        ecx,eax,0  
007218DA  sub         esp,8  
007218DD  movsd       xmm0,mmword ptr arr2[ecx]  
007218E3  movsd       mmword ptr [esp],xmm0  
007218E8  mov         edx,4  
007218ED  imul        eax,edx,0  
007218F0  mov         ecx,dword ptr arr1[eax]  
007218F4  push        ecx  
007218F5  push        offset string "%d %g\n" (0727B30h)  
007218FA  call        _printf (07210D2h)  
007218FF  add         esp,10h  

	*arr1 += 100;
00721902  mov         eax,4  
00721907  imul        ecx,eax,0  
0072190A  mov         edx,dword ptr arr1[ecx]  
0072190E  add         edx,64h  
00721911  mov         eax,4  
00721916  imul        ecx,eax,0  
00721919  mov         dword ptr arr1[ecx],edx  
	*arr2 += 120;
0072191D  mov         eax,8  
00721922  imul        ecx,eax,0  
00721925  movsd       xmm0,mmword ptr arr2[ecx]  
0072192B  addsd       xmm0,mmword ptr [__real@405e000000000000 (0727B68h)]  
00721933  mov         edx,8  
00721938  imul        eax,edx,0  
0072193B  movsd       mmword ptr arr2[eax],xmm0  

	printf("%d %g\n", *arr1, *arr2);
00721941  mov         eax,8  
00721946  imul        ecx,eax,0  
00721949  sub         esp,8  
0072194C  movsd       xmm0,mmword ptr arr2[ecx]  
00721952  movsd       mmword ptr [esp],xmm0  
00721957  mov         edx,4  
0072195C  imul        eax,edx,0  
0072195F  mov         ecx,dword ptr arr1[eax]  
00721963  push        ecx  
00721964  push        offset string "%d %g\n" (0727B30h)  
00721969  call        _printf (07210D2h)  
0072196E  add         esp,10h  
	printf("%d %g\n", arr1[0], arr2[0]);
00721971  mov         eax,8  
00721976  imul        ecx,eax,0  
00721979  sub         esp,8  
0072197C  movsd       xmm0,mmword ptr arr2[ecx]  
00721982  movsd       mmword ptr [esp],xmm0  
00721987  mov         edx,4  
0072198C  imul        eax,edx,0  
0072198F  mov         ecx,dword ptr arr1[eax]  
00721993  push        ecx  
00721994  push        offset string "%d %g\n" (0727B30h)  
00721999  call        _printf (07210D2h)  
0072199E  add         esp,10h  

	return 0;
007219A1  xor         eax,eax  
}
007219A3  push        edx  
007219A4  mov         ecx,ebp  
007219A6  push        eax  
007219A7  lea         edx,ds:[7219C8h]  
007219AD  call        @_RTC_CheckStackVars@8 (07211EAh)  
007219B2  pop         eax  
007219B3  pop         edx  
007219B4  pop         edi  
007219B5  pop         esi  
007219B6  pop         ebx  
007219B7  add         esp,0F4h  
007219BD  cmp         ebp,esp  
007219BF  call        __RTC_CheckEsp (072124Eh)  
007219C4  mov         esp,ebp  
007219C6  pop         ebp  
007219C7  ret

 


 

#include <stdio.h>

int main(voie)
{
008F1870  push        ebp  
008F1871  mov         ebp,esp  
008F1873  sub         esp,0E4h  
008F1879  push        ebx  
008F187A  push        esi  
008F187B  push        edi  
008F187C  lea         edi,[ebp-24h]  
008F187F  mov         ecx,9  
008F1884  mov         eax,0CCCCCCCCh  
008F1889  rep stos    dword ptr es:[edi]  
008F188B  mov         eax,dword ptr [__security_cookie (08FA000h)]  
008F1890  xor         eax,ebp  
008F1892  mov         dword ptr [ebp-4],eax  
008F1895  mov         ecx,offset _2BE40005_ArrayNameIsPointer@c (08FC008h)  
008F189A  call        @__CheckForDebuggerJustMyCode@4 (08F132Ah)  
008F189F  nop  
	int arr[3] = { 15,25,35 };
008F18A0  mov         dword ptr [arr],0Fh  
008F18A7  mov         dword ptr [ebp-10h],19h  
008F18AE  mov         dword ptr [ebp-0Ch],23h  
	int* ptr = &arr[0];		// int* ptr = arr; 동일한 문장
008F18B5  mov         eax,4  
008F18BA  imul        ecx,eax,0  
008F18BD  lea         edx,arr[ecx]  
008F18C1  mov         dword ptr [ptr],edx  

	printf("%d %d\n", ptr[0], arr[0]);
008F18C4  mov         eax,4  
008F18C9  imul        ecx,eax,0  
008F18CC  mov         edx,dword ptr arr[ecx]  
008F18D0  push        edx  
008F18D1  mov         eax,4  
008F18D6  imul        ecx,eax,0  
008F18D9  mov         edx,dword ptr [ptr]  
008F18DC  mov         eax,dword ptr [edx+ecx]  
008F18DF  push        eax  
008F18E0  push        offset string "%d %d\n" (08F7B30h)  
008F18E5  call        _printf (08F10D2h)  
008F18EA  add         esp,0Ch  
	printf("%d %d\n", ptr[1], arr[1]);
008F18ED  mov         eax,4  
008F18F2  shl         eax,0  
008F18F5  mov         ecx,dword ptr arr[eax]  
008F18F9  push        ecx  
008F18FA  mov         edx,4  
008F18FF  shl         edx,0  
008F1902  mov         eax,dword ptr [ptr]  
008F1905  mov         ecx,dword ptr [eax+edx]  
008F1908  push        ecx  
008F1909  push        offset string "%d %d\n" (08F7B30h)  
008F190E  call        _printf (08F10D2h)  
008F1913  add         esp,0Ch  
	printf("%d %d\n", ptr[2], arr[2]);
008F1916  mov         eax,4  
008F191B  shl         eax,1  
008F191D  mov         ecx,dword ptr arr[eax]  
008F1921  push        ecx  
008F1922  mov         edx,4  
008F1927  shl         edx,1  
008F1929  mov         eax,dword ptr [ptr]  
008F192C  mov         ecx,dword ptr [eax+edx]  
008F192F  push        ecx  
008F1930  push        offset string "%d %d\n" (08F7B30h)  
008F1935  call        _printf (08F10D2h)  
008F193A  add         esp,0Ch  
	printf("%d %d\n", *ptr, *arr);
008F193D  mov         eax,4  
008F1942  imul        ecx,eax,0  
008F1945  mov         edx,dword ptr arr[ecx]  
008F1949  push        edx  
008F194A  mov         eax,dword ptr [ptr]  
008F194D  mov         ecx,dword ptr [eax]  
008F194F  push        ecx  
008F1950  push        offset string "%d %d\n" (08F7B30h)  
008F1955  call        _printf (08F10D2h)  
008F195A  add         esp,0Ch  

	return 0;
008F195D  xor         eax,eax  
}
008F195F  push        edx  
008F1960  mov         ecx,ebp  
008F1962  push        eax  
008F1963  lea         edx,ds:[8F1990h]  
008F1969  call        @_RTC_CheckStackVars@8 (08F11EAh)  
008F196E  pop         eax  
008F196F  pop         edx  
008F1970  pop         edi  
008F1971  pop         esi  
008F1972  pop         ebx  
008F1973  mov         ecx,dword ptr [ebp-4]  
008F1976  xor         ecx,ebp  
008F1978  call        @__security_check_cookie@4 (08F114Fh)  
008F197D  add         esp,0E4h  
008F1983  cmp         ebp,esp  
008F1985  call        __RTC_CheckEsp (08F124Eh)  
008F198A  mov         esp,ebp  
008F198C  pop         ebp  
008F198D  ret

 


 

#include <stdio.h>

int main(void)
{
00BD1870  push        ebp  
00BD1871  mov         ebp,esp  
00BD1873  sub         esp,0D8h  
00BD1879  push        ebx  
00BD187A  push        esi  
00BD187B  push        edi  
00BD187C  lea         edi,[ebp-18h]  
00BD187F  mov         ecx,6  
00BD1884  mov         eax,0CCCCCCCCh  
00BD1889  rep stos    dword ptr es:[edi]  
00BD188B  mov         ecx,offset _028D4307_PointerOperaionResult@c (0BDC008h)  
00BD1890  call        @__CheckForDebuggerJustMyCode@4 (0BD132Ah)  
00BD1895  nop  
	int* ptr1 = 0x0010;
00BD1896  mov         dword ptr [ptr1],10h  
	double* ptr2 = 0x0010;
00BD189D  mov         dword ptr [ptr2],10h  

	printf("%p %p\n", ptr1 + 1, ptr1 + 2);		// 4 증가하고 8 증가한다
00BD18A4  mov         eax,dword ptr [ptr1]  
00BD18A7  add         eax,8  
00BD18AA  push        eax  
00BD18AB  mov         ecx,dword ptr [ptr1]  
00BD18AE  add         ecx,4  
00BD18B1  push        ecx  
00BD18B2  push        offset string "%p %p\n" (0BD7B30h)  
00BD18B7  call        _printf (0BD10D2h)  
00BD18BC  add         esp,0Ch  
	printf("%p %p\n\n", ptr2 + 1, ptr2 + 2);		// 8 증가하고 16 증가한다
00BD18BF  mov         eax,dword ptr [ptr2]  
00BD18C2  add         eax,10h  
00BD18C5  push        eax  
00BD18C6  mov         ecx,dword ptr [ptr2]  
00BD18C9  add         ecx,8  
00BD18CC  push        ecx  
00BD18CD  push        offset string "%p %p\n\n" (0BD7B38h)  
00BD18D2  call        _printf (0BD10D2h)  
00BD18D7  add         esp,0Ch  

	printf("%p %p\n", ptr1, ptr2);
00BD18DA  mov         eax,dword ptr [ptr2]  
00BD18DD  push        eax  
00BD18DE  mov         ecx,dword ptr [ptr1]  
00BD18E1  push        ecx  
00BD18E2  push        offset string "%p %p\n" (0BD7B30h)  
00BD18E7  call        _printf (0BD10D2h)  
00BD18EC  add         esp,0Ch  
	ptr1++;		// 4 증가
00BD18EF  mov         eax,dword ptr [ptr1]  
00BD18F2  add         eax,4  
00BD18F5  mov         dword ptr [ptr1],eax  
	ptr2++;		// 8 증가
00BD18F8  mov         eax,dword ptr [ptr2]  
00BD18FB  add         eax,8  
00BD18FE  mov         dword ptr [ptr2],eax  
	printf("%p %p\n", ptr1, ptr2);
00BD1901  mov         eax,dword ptr [ptr2]  
00BD1904  push        eax  
00BD1905  mov         ecx,dword ptr [ptr1]  
00BD1908  push        ecx  
00BD1909  push        offset string "%p %p\n" (0BD7B30h)  
00BD190E  call        _printf (0BD10D2h)  
00BD1913  add         esp,0Ch  

	return 0;
00BD1916  xor         eax,eax  
}
00BD1918  pop         edi  
00BD1919  pop         esi  
00BD191A  pop         ebx  
00BD191B  add         esp,0D8h  
00BD1921  cmp         ebp,esp  
00BD1923  call        __RTC_CheckEsp (0BD124Eh)  
00BD1928  mov         esp,ebp  
00BD192A  pop         ebp  
00BD192B  ret

 

#include <stdio.h>

int main(void)
{
00007FF6CD5C1890  push        rbp  
00007FF6CD5C1892  push        rdi  
00007FF6CD5C1893  sub         rsp,128h  
00007FF6CD5C189A  lea         rbp,[rsp+20h]  
00007FF6CD5C189F  lea         rcx,[__028D4307_PointerOperaionResult@c (07FF6CD5D2008h)]  
00007FF6CD5C18A6  call        __CheckForDebuggerJustMyCode (07FF6CD5C136Bh)  
00007FF6CD5C18AB  nop  
	int* ptr1 = 0x0010;
00007FF6CD5C18AC  mov         qword ptr [ptr1],10h  
	double* ptr2 = 0x0010;
00007FF6CD5C18B4  mov         qword ptr [ptr2],10h  

	printf("%p %p\n", ptr1 + 1, ptr1 + 2);		// 4 증가하고 8 증가한다
00007FF6CD5C18BC  mov         rax,qword ptr [ptr1]  
00007FF6CD5C18C0  add         rax,8  
00007FF6CD5C18C4  mov         rcx,qword ptr [ptr1]  
00007FF6CD5C18C8  add         rcx,4  
00007FF6CD5C18CC  mov         r8,rax  
00007FF6CD5C18CF  mov         rdx,rcx  
00007FF6CD5C18D2  lea         rcx,[string "%p %p\n" (07FF6CD5CAC24h)]  
00007FF6CD5C18D9  call        printf (07FF6CD5C1195h)  
00007FF6CD5C18DE  nop  
	printf("%p %p\n\n", ptr2 + 1, ptr2 + 2);		// 8 증가하고 16 증가한다
00007FF6CD5C18DF  mov         rax,qword ptr [ptr2]  
00007FF6CD5C18E3  add         rax,10h  
00007FF6CD5C18E7  mov         rcx,qword ptr [ptr2]  
00007FF6CD5C18EB  add         rcx,8  
00007FF6CD5C18EF  mov         r8,rax  
00007FF6CD5C18F2  mov         rdx,rcx  
00007FF6CD5C18F5  lea         rcx,[string "%p %p\n\n" (07FF6CD5CAC30h)]  
00007FF6CD5C18FC  call        printf (07FF6CD5C1195h)  
00007FF6CD5C1901  nop  

	printf("%p %p\n", ptr1, ptr2);
00007FF6CD5C1902  mov         r8,qword ptr [ptr2]  
00007FF6CD5C1906  mov         rdx,qword ptr [ptr1]  
00007FF6CD5C190A  lea         rcx,[string "%p %p\n" (07FF6CD5CAC24h)]  
00007FF6CD5C1911  call        printf (07FF6CD5C1195h)  
00007FF6CD5C1916  nop  
	ptr1++;		// 4 증가
00007FF6CD5C1917  mov         rax,qword ptr [ptr1]  
00007FF6CD5C191B  add         rax,4  
00007FF6CD5C191F  mov         qword ptr [ptr1],rax  
	ptr2++;		// 8 증가
00007FF6CD5C1923  mov         rax,qword ptr [ptr2]  
00007FF6CD5C1927  add         rax,8  
00007FF6CD5C192B  mov         qword ptr [ptr2],rax  
	printf("%p %p\n", ptr1, ptr2);
00007FF6CD5C192F  mov         r8,qword ptr [ptr2]  
00007FF6CD5C1933  mov         rdx,qword ptr [ptr1]  
00007FF6CD5C1937  lea         rcx,[string "%p %p\n" (07FF6CD5CAC24h)]  
00007FF6CD5C193E  call        printf (07FF6CD5C1195h)  
00007FF6CD5C1943  nop  

	return 0;
00007FF6CD5C1944  xor         eax,eax  
}
00007FF6CD5C1946  lea         rsp,[rbp+108h]  
00007FF6CD5C194D  pop         rdi  
00007FF6CD5C194E  pop         rbp  
00007FF6CD5C194F  ret

 

* x86 64비트 rcx, rdx, r8 레지스터를 이용해 매개변수 전달

 


 

#include <stdio.h>

int main(void)
{
00291870  push        ebp  
00291871  mov         ebp,esp  
00291873  sub         esp,0E4h  
00291879  push        ebx  
0029187A  push        esi  
0029187B  push        edi  
0029187C  lea         edi,[ebp-24h]  
0029187F  mov         ecx,9  
00291884  mov         eax,0CCCCCCCCh  
00291889  rep stos    dword ptr es:[edi]  
0029188B  mov         eax,dword ptr [__security_cookie (029A000h)]  
00291890  xor         eax,ebp  
00291892  mov         dword ptr [ebp-4],eax  
00291895  mov         ecx,offset _51EBF2B1_PointerBaseArrayAccess@c (029C008h)  
0029189A  call        @__CheckForDebuggerJustMyCode@4 (029132Ah)  
0029189F  nop  
	int arr[3] = { 11,22,33 };
002918A0  mov         dword ptr [arr],0Bh  
002918A7  mov         dword ptr [ebp-10h],16h  
002918AE  mov         dword ptr [ebp-0Ch],21h  
	int* ptr = arr;
002918B5  lea         eax,[arr]  
002918B8  mov         dword ptr [ptr],eax  
	printf("%d %d %d\n", *ptr, *(ptr + 1), *(ptr + 2));
002918BB  mov         eax,dword ptr [ptr]  
002918BE  mov         ecx,dword ptr [eax+8]  
002918C1  push        ecx  
002918C2  mov         edx,dword ptr [ptr]  
002918C5  mov         eax,dword ptr [edx+4]  
002918C8  push        eax  
002918C9  mov         ecx,dword ptr [ptr]  
002918CC  mov         edx,dword ptr [ecx]  
002918CE  push        edx  
002918CF  push        offset string "%d %d %d\n" (0297B30h)  
002918D4  call        _printf (02910D2h)  
002918D9  add         esp,10h  
	
	printf("%d ", *ptr); ptr++;
002918DC  mov         eax,dword ptr [ptr]  
002918DF  mov         ecx,dword ptr [eax]  
002918E1  push        ecx  
002918E2  push        offset string "%d " (0297B3Ch)  
002918E7  call        _printf (02910D2h)  
002918EC  add         esp,8  
002918EF  mov         eax,dword ptr [ptr]  
002918F2  add         eax,4  
002918F5  mov         dword ptr [ptr],eax  
	printf("%d ", *ptr); ptr++;
002918F8  mov         eax,dword ptr [ptr]  
002918FB  mov         ecx,dword ptr [eax]  
002918FD  push        ecx  
002918FE  push        offset string "%d " (0297B3Ch)  
00291903  call        _printf (02910D2h)  
00291908  add         esp,8  
0029190B  mov         eax,dword ptr [ptr]  
0029190E  add         eax,4  
00291911  mov         dword ptr [ptr],eax  
	printf("%d ", *ptr); ptr--;
00291914  mov         eax,dword ptr [ptr]  
00291917  mov         ecx,dword ptr [eax]  
00291919  push        ecx  
0029191A  push        offset string "%d " (0297B3Ch)  
0029191F  call        _printf (02910D2h)  
00291924  add         esp,8  
00291927  mov         eax,dword ptr [ptr]  
0029192A  sub         eax,4  
0029192D  mov         dword ptr [ptr],eax  
	printf("%d ", *ptr); ptr--;
00291930  mov         eax,dword ptr [ptr]  
00291933  mov         ecx,dword ptr [eax]  
00291935  push        ecx  
00291936  push        offset string "%d " (0297B3Ch)  
0029193B  call        _printf (02910D2h)  
00291940  add         esp,8  
00291943  mov         eax,dword ptr [ptr]  
00291946  sub         eax,4  
00291949  mov         dword ptr [ptr],eax  
	printf("%d ", *ptr); printf("\n");
0029194C  mov         eax,dword ptr [ptr]  
0029194F  mov         ecx,dword ptr [eax]  
00291951  push        ecx  
00291952  push        offset string "%d " (0297B3Ch)  
00291957  call        _printf (02910D2h)  
0029195C  add         esp,8  
0029195F  push        offset string "\n" (0297B40h)  
00291964  call        _printf (02910D2h)  
00291969  add         esp,4  

	return 0;
0029196C  xor         eax,eax  
}
0029196E  push        edx  
0029196F  mov         ecx,ebp  
00291971  push        eax  
00291972  lea         edx,ds:[2919A0h]  
00291978  call        @_RTC_CheckStackVars@8 (02911EAh)  
0029197D  pop         eax  
0029197E  pop         edx  
0029197F  pop         edi  
00291980  pop         esi  
00291981  pop         ebx  
00291982  mov         ecx,dword ptr [ebp-4]  
00291985  xor         ecx,ebp  
00291987  call        @__security_check_cookie@4 (029114Fh)  
0029198C  add         esp,0E4h  
00291992  cmp         ebp,esp  
00291994  call        __RTC_CheckEsp (029124Eh)  
00291999  mov         esp,ebp  
0029199B  pop         ebp  
0029199C  ret

 

#include <stdio.h>

int main(void)
{
00007FF674601890  push        rbp  
00007FF674601892  push        rdi  
00007FF674601893  sub         rsp,138h  
00007FF67460189A  lea         rbp,[rsp+20h]  
00007FF67460189F  lea         rdi,[rsp+20h]  
00007FF6746018A4  mov         ecx,16h  
00007FF6746018A9  mov         eax,0CCCCCCCCh  
00007FF6746018AE  rep stos    dword ptr [rdi]  
00007FF6746018B0  mov         rax,qword ptr [__security_cookie (07FF67460D000h)]  
00007FF6746018B7  xor         rax,rbp  
00007FF6746018BA  mov         qword ptr [rbp+108h],rax  
00007FF6746018C1  lea         rcx,[__51EBF2B1_PointerBaseArrayAccess@c (07FF674612008h)]  
00007FF6746018C8  call        __CheckForDebuggerJustMyCode (07FF67460136Bh)  
00007FF6746018CD  nop  
	int arr[3] = { 11,22,33 };
00007FF6746018CE  mov         dword ptr [arr],0Bh  
00007FF6746018D5  mov         dword ptr [rbp+0Ch],16h  
00007FF6746018DC  mov         dword ptr [rbp+10h],21h  
	int* ptr = arr;
00007FF6746018E3  lea         rax,[arr]  
00007FF6746018E7  mov         qword ptr [ptr],rax  
	printf("%d %d %d\n", *ptr, *(ptr + 1), *(ptr + 2));
00007FF6746018EB  mov         rax,qword ptr [ptr]  
00007FF6746018EF  mov         r9d,dword ptr [rax+8]  
00007FF6746018F3  mov         rax,qword ptr [ptr]  
00007FF6746018F7  mov         r8d,dword ptr [rax+4]  
00007FF6746018FB  mov         rax,qword ptr [ptr]  
00007FF6746018FF  mov         edx,dword ptr [rax]  
00007FF674601901  lea         rcx,[string "%d %d %d\n" (07FF67460ACA8h)]  
00007FF674601908  call        printf (07FF674601195h)  
00007FF67460190D  nop  
	
	printf("%d ", *ptr); ptr++;
00007FF67460190E  mov         rax,qword ptr [ptr]  
00007FF674601912  mov         edx,dword ptr [rax]  
00007FF674601914  lea         rcx,[string "%d " (07FF67460ACB4h)]  
00007FF67460191B  call        printf (07FF674601195h)  
00007FF674601920  nop  
00007FF674601921  mov         rax,qword ptr [ptr]  
00007FF674601925  add         rax,4  
00007FF674601929  mov         qword ptr [ptr],rax  
	printf("%d ", *ptr); ptr++;
00007FF67460192D  mov         rax,qword ptr [ptr]  
00007FF674601931  mov         edx,dword ptr [rax]  
00007FF674601933  lea         rcx,[string "%d " (07FF67460ACB4h)]  
00007FF67460193A  call        printf (07FF674601195h)  
00007FF67460193F  nop  
00007FF674601940  mov         rax,qword ptr [ptr]  
00007FF674601944  add         rax,4  
00007FF674601948  mov         qword ptr [ptr],rax  
	printf("%d ", *ptr); ptr--;
00007FF67460194C  mov         rax,qword ptr [ptr]  
00007FF674601950  mov         edx,dword ptr [rax]  
00007FF674601952  lea         rcx,[string "%d " (07FF67460ACB4h)]  
00007FF674601959  call        printf (07FF674601195h)  
00007FF67460195E  nop  
00007FF67460195F  mov         rax,qword ptr [ptr]  
00007FF674601963  sub         rax,4  
00007FF674601967  mov         qword ptr [ptr],rax  
	printf("%d ", *ptr); ptr--;
00007FF67460196B  mov         rax,qword ptr [ptr]  
00007FF67460196F  mov         edx,dword ptr [rax]  
00007FF674601971  lea         rcx,[string "%d " (07FF67460ACB4h)]  
00007FF674601978  call        printf (07FF674601195h)  
00007FF67460197D  nop  
00007FF67460197E  mov         rax,qword ptr [ptr]  
00007FF674601982  sub         rax,4  
00007FF674601986  mov         qword ptr [ptr],rax  
	printf("%d ", *ptr); printf("\n");
00007FF67460198A  mov         rax,qword ptr [ptr]  
00007FF67460198E  mov         edx,dword ptr [rax]  
00007FF674601990  lea         rcx,[string "%d " (07FF67460ACB4h)]  
00007FF674601997  call        printf (07FF674601195h)  
00007FF67460199C  nop  
00007FF67460199D  lea         rcx,[string "\n" (07FF67460ACB8h)]  
00007FF6746019A4  call        printf (07FF674601195h)  
00007FF6746019A9  nop  

	return 0;
00007FF6746019AA  xor         eax,eax  
}
00007FF6746019AC  mov         edi,eax  
00007FF6746019AE  lea         rcx,[rbp-20h]  
00007FF6746019B2  lea         rdx,[__xt_z+1E0h (07FF67460AC80h)]  
00007FF6746019B9  call        _RTC_CheckStackVars (07FF674601307h)  
00007FF6746019BE  mov         eax,edi  
00007FF6746019C0  mov         rcx,qword ptr [rbp+108h]  
00007FF6746019C7  xor         rcx,rbp  
00007FF6746019CA  call        __security_check_cookie (07FF6746011AEh)  
00007FF6746019CF  lea         rsp,[rbp+118h]  
00007FF6746019D6  pop         rdi  
00007FF6746019D7  pop         rbp  
00007FF6746019D8  ret

 

* arr[i] === *(arr + 1)

 


 

* 문자열 선언 두 가지 방식

   ① 변수 형태의 문자열

   ② 상수 형태의 문자열

 

#include <stdio.h>

int main(void)
{
007A1870  push        ebp  
007A1871  mov         ebp,esp  
007A1873  sub         esp,0E4h  
007A1879  push        ebx  
007A187A  push        esi  
007A187B  push        edi  
007A187C  lea         edi,[ebp-24h]  
007A187F  mov         ecx,9  
007A1884  mov         eax,0CCCCCCCCh  
007A1889  rep stos    dword ptr es:[edi]  
007A188B  mov         eax,dword ptr [__security_cookie (07AA000h)]  
007A1890  xor         eax,ebp  
007A1892  mov         dword ptr [ebp-4],eax  
007A1895  mov         ecx,offset _FCE9E3FA_TwoStringType@c (07AC008h)  
007A189A  call        @__CheckForDebuggerJustMyCode@4 (07A132Ah)  
007A189F  nop  
	char str1[] = "My String-1";	// 변수 형태의 문자열
007A18A0  mov         eax,dword ptr [string "My String-1" (07A7B30h)]  
007A18A5  mov         dword ptr [str1],eax  
007A18A8  mov         ecx,dword ptr ds:[7A7B34h]  
007A18AE  mov         dword ptr [ebp-10h],ecx  
007A18B1  mov         edx,dword ptr ds:[7A7B38h]  
007A18B7  mov         dword ptr [ebp-0Ch],edx  
	char* str2 = "My String-2";		// 상수 형태의 문자열
007A18BA  mov         dword ptr [str2],offset string "My String-2" (07A7B40h)  
	printf("%s %s\n", str1, str2);
007A18C1  mov         eax,dword ptr [str2]  
007A18C4  push        eax  
007A18C5  lea         ecx,[str1]  
007A18C8  push        ecx  
007A18C9  push        offset string "%s %s\n" (07A7B50h)  
007A18CE  call        _printf (07A10D2h)  
007A18D3  add         esp,0Ch  

	str2 = "Our String";			// 가리키는 대상 변경
007A18D6  mov         dword ptr [str2],offset string "Our String" (07A7B58h)  
	printf("%s %s\n", str1, str2);
007A18DD  mov         eax,dword ptr [str2]  
007A18E0  push        eax  
007A18E1  lea         ecx,[str1]  
007A18E4  push        ecx  
007A18E5  push        offset string "%s %s\n" (07A7B50h)  
007A18EA  call        _printf (07A10D2h)  
007A18EF  add         esp,0Ch  

	str1[0] = 'x';					// 문자열 변경 성공
007A18F2  mov         eax,1  
007A18F7  imul        ecx,eax,0  
007A18FA  mov         byte ptr str1[ecx],78h  
	//str2[0] = 'x';					// 문자열 변경 실패
	printf("%s %s\n", str1, str2);
007A18FF  mov         eax,dword ptr [str2]  
007A1902  push        eax  
007A1903  lea         ecx,[str1]  
007A1906  push        ecx  
007A1907  push        offset string "%s %s\n" (07A7B50h)  
007A190C  call        _printf (07A10D2h)  
007A1911  add         esp,0Ch  

	return 0;
007A1914  xor         eax,eax  
}
007A1916  push        edx  
007A1917  mov         ecx,ebp  
007A1919  push        eax  
007A191A  lea         edx,ds:[7A1948h]  
007A1920  call        @_RTC_CheckStackVars@8 (07A11EAh)  
007A1925  pop         eax  
007A1926  pop         edx  
007A1927  pop         edi  
007A1928  pop         esi  
007A1929  pop         ebx  
007A192A  mov         ecx,dword ptr [ebp-4]  
007A192D  xor         ecx,ebp  
007A192F  call        @__security_check_cookie@4 (07A114Fh)  
007A1934  add         esp,0E4h  
007A193A  cmp         ebp,esp  
007A193C  call        __RTC_CheckEsp (07A124Eh)  
007A1941  mov         esp,ebp  
007A1943  pop         ebp  
007A1944  ret

 

 

#include <stdio.h>

int main(void)
{
00007FF6570F1890  push        rbp  
00007FF6570F1892  push        rsi  
00007FF6570F1893  push        rdi  
00007FF6570F1894  sub         rsp,130h  
00007FF6570F189B  lea         rbp,[rsp+20h]  
00007FF6570F18A0  lea         rdi,[rsp+20h]  
00007FF6570F18A5  mov         ecx,14h  
00007FF6570F18AA  mov         eax,0CCCCCCCCh  
00007FF6570F18AF  rep stos    dword ptr [rdi]  
00007FF6570F18B1  mov         rax,qword ptr [__security_cookie (07FF6570FD000h)]  
00007FF6570F18B8  xor         rax,rbp  
00007FF6570F18BB  mov         qword ptr [rbp+108h],rax  
00007FF6570F18C2  lea         rcx,[__FCE9E3FA_TwoStringType@c (07FF657102008h)]  
00007FF6570F18C9  call        __CheckForDebuggerJustMyCode (07FF6570F136Bh)  
00007FF6570F18CE  nop  
	char str1[] = "My String-1";	// 변수 형태의 문자열
00007FF6570F18CF  lea         rax,[str1]  
00007FF6570F18D3  lea         rcx,[string "My String-1" (07FF6570FACA8h)]  
00007FF6570F18DA  mov         rdi,rax  
00007FF6570F18DD  mov         rsi,rcx  
00007FF6570F18E0  mov         ecx,0Ch  
00007FF6570F18E5  rep movs    byte ptr [rdi],byte ptr [rsi]  
	char* str2 = "My String-2";		// 상수 형태의 문자열
00007FF6570F18E7  lea         rax,[string "My String-2" (07FF6570FACB8h)]  
00007FF6570F18EE  mov         qword ptr [str2],rax  
	printf("%s %s\n", str1, str2);
00007FF6570F18F2  mov         r8,qword ptr [str2]  
00007FF6570F18F6  lea         rdx,[str1]  
00007FF6570F18FA  lea         rcx,[string "%s %s\n" (07FF6570FACC8h)]  
00007FF6570F1901  call        printf (07FF6570F1195h)  
00007FF6570F1906  nop  

	str2 = "Our String";			// 가리키는 대상 변경
00007FF6570F1907  lea         rax,[string "Our String" (07FF6570FACD0h)]  
00007FF6570F190E  mov         qword ptr [str2],rax  
	printf("%s %s\n", str1, str2);
00007FF6570F1912  mov         r8,qword ptr [str2]  
00007FF6570F1916  lea         rdx,[str1]  
00007FF6570F191A  lea         rcx,[string "%s %s\n" (07FF6570FACC8h)]  
00007FF6570F1921  call        printf (07FF6570F1195h)  
00007FF6570F1926  nop  

	str1[0] = 'x';					// 문자열 변경 성공
00007FF6570F1927  mov         eax,1  
00007FF6570F192C  imul        rax,rax,0  
00007FF6570F1930  mov         byte ptr str1[rax],78h  
	//str2[0] = 'x';					// 문자열 변경 실패
	printf("%s %s\n", str1, str2);
00007FF6570F1935  mov         r8,qword ptr [str2]  
00007FF6570F1939  lea         rdx,[str1]  
00007FF6570F193D  lea         rcx,[string "%s %s\n" (07FF6570FACC8h)]  
00007FF6570F1944  call        printf (07FF6570F1195h)  
00007FF6570F1949  nop  

	return 0;
00007FF6570F194A  xor         eax,eax  
}
00007FF6570F194C  mov         edi,eax  
00007FF6570F194E  lea         rcx,[rbp-20h]  
00007FF6570F1952  lea         rdx,[__xt_z+1E0h (07FF6570FAC80h)]  
00007FF6570F1959  call        _RTC_CheckStackVars (07FF6570F1307h)  
00007FF6570F195E  mov         eax,edi  
00007FF6570F1960  mov         rcx,qword ptr [rbp+108h]  
00007FF6570F1967  xor         rcx,rbp  
00007FF6570F196A  call        __security_check_cookie (07FF6570F11AEh)  
00007FF6570F196F  lea         rsp,[rbp+110h]  
00007FF6570F1976  pop         rdi  
00007FF6570F1977  pop         rsi  
00007FF6570F1978  pop         rbp  
00007FF6570F1979  ret

 

 


 

#include <stdio.h>

int main(void)
{
00ED1870  push        ebp  
00ED1871  mov         ebp,esp  
00ED1873  sub         esp,0D4h  
00ED1879  push        ebx  
00ED187A  push        esi  
00ED187B  push        edi  
00ED187C  lea         edi,[ebp-14h]  
00ED187F  mov         ecx,5  
00ED1884  mov         eax,0CCCCCCCCh  
00ED1889  rep stos    dword ptr es:[edi]  
00ED188B  mov         ecx,offset _59F4CCFE_StringArray@c (0EDC008h)  
00ED1890  call        @__CheckForDebuggerJustMyCode@4 (0ED132Ah)  
00ED1895  nop  
	char* strArr[3] = { "Simple", "String", "Array" };
00ED1896  mov         dword ptr [strArr],offset string "Simple" (0ED7B30h)  
00ED189D  mov         dword ptr [ebp-0Ch],offset string "String" (0ED7B38h)  
00ED18A4  mov         dword ptr [ebp-8],offset string "Array" (0ED7B40h)  

	printf("%s\n", strArr[0]);
00ED18AB  mov         eax,4  
00ED18B0  imul        ecx,eax,0  
00ED18B3  mov         edx,dword ptr strArr[ecx]  
00ED18B7  push        edx  
00ED18B8  push        offset string "%s\n" (0ED7B48h)  
00ED18BD  call        _printf (0ED10D2h)  
00ED18C2  add         esp,8  
	printf("%s\n", strArr[1]);
00ED18C5  mov         eax,4  
00ED18CA  shl         eax,0  
00ED18CD  mov         ecx,dword ptr strArr[eax]  
00ED18D1  push        ecx  
00ED18D2  push        offset string "%s\n" (0ED7B48h)  
00ED18D7  call        _printf (0ED10D2h)  
00ED18DC  add         esp,8  
	printf("%s\n", strArr[2]);
00ED18DF  mov         eax,4  
00ED18E4  shl         eax,1  
00ED18E6  mov         ecx,dword ptr strArr[eax]  
00ED18EA  push        ecx  
00ED18EB  push        offset string "%s\n" (0ED7B48h)  
00ED18F0  call        _printf (0ED10D2h)  
00ED18F5  add         esp,8  

	return 0;
00ED18F8  xor         eax,eax  
}
00ED18FA  push        edx  
00ED18FB  mov         ecx,ebp  
00ED18FD  push        eax  
00ED18FE  lea         edx,ds:[0ED1920h]  
00ED1904  call        @_RTC_CheckStackVars@8 (0ED11EAh)  
00ED1909  pop         eax  
00ED190A  pop         edx  
00ED190B  pop         edi  
00ED190C  pop         esi  
00ED190D  pop         ebx  
00ED190E  add         esp,0D4h  
00ED1914  cmp         ebp,esp  
00ED1916  call        __RTC_CheckEsp (0ED124Eh)  
00ED191B  mov         esp,ebp  
00ED191D  pop         ebp  
00ED191E  ret

 

 


 

 


 

#include <stdio.h>

void ShowArrayElem(int* param, int len)
{
007C1830  push        ebp  
007C1831  mov         ebp,esp  
007C1833  sub         esp,0CCh  
007C1839  push        ebx  
007C183A  push        esi  
007C183B  push        edi  
007C183C  lea         edi,[ebp-0Ch]  
007C183F  mov         ecx,3  
007C1844  mov         eax,0CCCCCCCCh  
007C1849  rep stos    dword ptr es:[edi]  
007C184B  mov         ecx,offset _C8AFE5A2_ArrayParamAccess@c (07CC008h)  
007C1850  call        @__CheckForDebuggerJustMyCode@4 (07C1334h)  
007C1855  nop  
	int i;
	for (i = 0; i < len; i++)
007C1856  mov         dword ptr [i],0  
007C185D  jmp         __$EncStackInitStart+2Ch (07C1868h)  
007C185F  mov         eax,dword ptr [i]  
007C1862  add         eax,1  
007C1865  mov         dword ptr [i],eax  
007C1868  mov         eax,dword ptr [i]  
007C186B  cmp         eax,dword ptr [len]  
007C186E  jge         __$EncStackInitStart+4Dh (07C1889h)  
		printf("%d ", param[i]);
007C1870  mov         eax,dword ptr [i]  
007C1873  mov         ecx,dword ptr [param]  
007C1876  mov         edx,dword ptr [ecx+eax*4]  
007C1879  push        edx  
007C187A  push        offset string "%d " (07C7B30h)  
007C187F  call        _printf (07C10D2h)  
007C1884  add         esp,8  
007C1887  jmp         __$EncStackInitStart+23h (07C185Fh)  
	printf("\n");
007C1889  push        offset string "\n" (07C7B34h)  
007C188E  call        _printf (07C10D2h)  
007C1893  add         esp,4  
}
007C1896  pop         edi  
007C1897  pop         esi  
007C1898  pop         ebx  
007C1899  add         esp,0CCh  
007C189F  cmp         ebp,esp  
007C18A1  call        __RTC_CheckEsp (07C1258h)  
007C18A6  mov         esp,ebp  
007C18A8  pop         ebp  
007C18A9  ret 

/////////////////////////////////////////////////////////////////////////////////////////////

void AddArrayElem(int* param, int len, int add)
{
007C17A0  push        ebp  
007C17A1  mov         ebp,esp  
007C17A3  sub         esp,0CCh  
007C17A9  push        ebx  
007C17AA  push        esi  
007C17AB  push        edi  
007C17AC  lea         edi,[ebp-0Ch]  
007C17AF  mov         ecx,3  
007C17B4  mov         eax,0CCCCCCCCh  
007C17B9  rep stos    dword ptr es:[edi]  
007C17BB  mov         ecx,offset _C8AFE5A2_ArrayParamAccess@c (07CC008h)  
007C17C0  call        @__CheckForDebuggerJustMyCode@4 (07C1334h)  
007C17C5  nop  
	int i;
	for (i = 0; i < len; i++)
007C17C6  mov         dword ptr [i],0  
007C17CD  jmp         __$EncStackInitStart+2Ch (07C17D8h)  
007C17CF  mov         eax,dword ptr [i]  
007C17D2  add         eax,1  
007C17D5  mov         dword ptr [i],eax  
007C17D8  mov         eax,dword ptr [i]  
007C17DB  cmp         eax,dword ptr [len]  
007C17DE  jge         __$EncStackInitStart+4Bh (07C17F7h)  
		param[i] += add;
007C17E0  mov         eax,dword ptr [i]  
007C17E3  mov         ecx,dword ptr [param]  
007C17E6  mov         edx,dword ptr [ecx+eax*4]  
007C17E9  add         edx,dword ptr [add]  
007C17EC  mov         eax,dword ptr [i]  
007C17EF  mov         ecx,dword ptr [param]  
007C17F2  mov         dword ptr [ecx+eax*4],edx  
007C17F5  jmp         __$EncStackInitStart+23h (07C17CFh)  
}
007C17F7  pop         edi  
007C17F8  pop         esi  
007C17F9  pop         ebx  
007C17FA  add         esp,0CCh  
007C1800  cmp         ebp,esp  
007C1802  call        __RTC_CheckEsp (07C1258h)  
007C1807  mov         esp,ebp  
007C1809  pop         ebp  
007C180A  ret

////////////////////////////////////////////////////////////////////////////////////////////

int main(void)
{
007C19B0  push        ebp  
007C19B1  mov         ebp,esp  
007C19B3  sub         esp,0D8h  
007C19B9  push        ebx  
007C19BA  push        esi  
007C19BB  push        edi  
007C19BC  lea         edi,[ebp-18h]  
007C19BF  mov         ecx,6  
007C19C4  mov         eax,0CCCCCCCCh  
007C19C9  rep stos    dword ptr es:[edi]  
007C19CB  mov         eax,dword ptr [__security_cookie (07CA000h)]  
007C19D0  xor         eax,ebp  
007C19D2  mov         dword ptr [ebp-4],eax  
007C19D5  mov         ecx,offset _C8AFE5A2_ArrayParamAccess@c (07CC008h)  
007C19DA  call        @__CheckForDebuggerJustMyCode@4 (07C1334h)  
007C19DF  nop  
	int arr[3] = { 1,2,3 };
007C19E0  mov         dword ptr [arr],1  
007C19E7  mov         dword ptr [ebp-10h],2  
007C19EE  mov         dword ptr [ebp-0Ch],3  

	ShowArrayElem(arr, sizeof(arr) / sizeof(int));
007C19F5  push        3  
007C19F7  lea         eax,[arr]  
007C19FA  push        eax  
007C19FB  call        _ShowArrayElem (07C1140h)  
007C1A00  add         esp,8  

	printf("\n");
007C1A03  push        offset string "\n" (07C7B34h)  
007C1A08  call        _printf (07C10D2h)  
007C1A0D  add         esp,4  

	AddArrayElem(arr, sizeof(arr) / sizeof(int), 1);
007C1A10  push        1  
007C1A12  push        3  
007C1A14  lea         eax,[arr]  
007C1A17  push        eax  
007C1A18  call        _AddArrayElem (07C11E0h)  
007C1A1D  add         esp,0Ch  
	ShowArrayElem(arr, sizeof(arr) / sizeof(int));
007C1A20  push        3  
007C1A22  lea         eax,[arr]  
007C1A25  push        eax  
007C1A26  call        _ShowArrayElem (07C1140h)  
007C1A2B  add         esp,8  

	printf("\n");
007C1A2E  push        offset string "\n" (07C7B34h)  
007C1A33  call        _printf (07C10D2h)  
007C1A38  add         esp,4  

	AddArrayElem(arr, sizeof(arr) / sizeof(int), 2);
007C1A3B  push        2  
007C1A3D  push        3  
007C1A3F  lea         eax,[arr]  
007C1A42  push        eax  
007C1A43  call        _AddArrayElem (07C11E0h)  
007C1A48  add         esp,0Ch  
	ShowArrayElem(arr, sizeof(arr) / sizeof(int));
007C1A4B  push        3  
007C1A4D  lea         eax,[arr]  
007C1A50  push        eax  
007C1A51  call        _ShowArrayElem (07C1140h)  
007C1A56  add         esp,8  

	printf("\n");
007C1A59  push        offset string "\n" (07C7B34h)  
007C1A5E  call        _printf (07C10D2h)  
007C1A63  add         esp,4  

	AddArrayElem(arr, sizeof(arr) / sizeof(int), 3);
007C1A66  push        3  
007C1A68  push        3  
007C1A6A  lea         eax,[arr]  
007C1A6D  push        eax  
007C1A6E  call        _AddArrayElem (07C11E0h)  
007C1A73  add         esp,0Ch  
	ShowArrayElem(arr, sizeof(arr) / sizeof(int));
007C1A76  push        3  
007C1A78  lea         eax,[arr]  
007C1A7B  push        eax  
007C1A7C  call        _ShowArrayElem (07C1140h)  
007C1A81  add         esp,8  
}
007C1A84  xor         eax,eax  
007C1A86  push        edx  
007C1A87  mov         ecx,ebp  
007C1A89  push        eax  
007C1A8A  lea         edx,ds:[7C1AB8h]  
007C1A90  call        @_RTC_CheckStackVars@8 (07C11F4h)  
007C1A95  pop         eax  
007C1A96  pop         edx  
007C1A97  pop         edi  
007C1A98  pop         esi  
007C1A99  pop         ebx  
007C1A9A  mov         ecx,dword ptr [ebp-4]  
007C1A9D  xor         ecx,ebp  
007C1A9F  call        @__security_check_cookie@4 (07C1154h)  
007C1AA4  add         esp,0D8h  
007C1AAA  cmp         ebp,esp  
007C1AAC  call        __RTC_CheckEsp (07C1258h)  
007C1AB1  mov         esp,ebp  
007C1AB3  pop         ebp  
007C1AB4  ret

 

* 함수 내에서는 인자로 전달받은 배열의 길이를 계산할 수 없다

   배열의 주소 값을 인자로 전달받는 매개변수는 포인터 변수이기 때문

   ㄴ sizeof 하면 배열의 크기가 아닌 포인터 변수의 크기가 반환

   이렇듯 함수 내에서는 인자로 전달된 배열의 길이를 계산할 수가 없기 때문

   ㄴ 배열의 크기나 길이 정보도 함께 인자로 전달 필요

 


 

#include <stdio.h>

void Swap(int n1, int n2)
{
001A1790  push        ebp  
001A1791  mov         ebp,esp  
001A1793  sub         esp,0CCh  
001A1799  push        ebx  
001A179A  push        esi  
001A179B  push        edi  
001A179C  lea         edi,[ebp-0Ch]  
001A179F  mov         ecx,3  
001A17A4  mov         eax,0CCCCCCCCh  
001A17A9  rep stos    dword ptr es:[edi]  
001A17AB  mov         ecx,1AC008h  
001A17B0  call        001A132F  
001A17B5  nop  
	int temp = n1;
001A17B6  mov         eax,dword ptr [ebp+8]  
001A17B9  mov         dword ptr [ebp-8],eax  
	n1 = n2;
001A17BC  mov         eax,dword ptr [ebp+0Ch]  
001A17BF  mov         dword ptr [ebp+8],eax  
	n2 = temp;
001A17C2  mov         eax,dword ptr [ebp-8]  
001A17C5  mov         dword ptr [ebp+0Ch],eax  
	printf("n1, n2: %d %d\n", n1, n2);
001A17C8  mov         eax,dword ptr [ebp+0Ch]  
001A17CB  push        eax  
001A17CC  mov         ecx,dword ptr [ebp+8]  
001A17CF  push        ecx  
001A17D0  push        1A7B30h  
001A17D5  call        001A10D2  
001A17DA  add         esp,0Ch  
}
001A17DD  pop         edi  
001A17DE  pop         esi  
001A17DF  pop         ebx  
001A17E0  add         esp,0CCh  
001A17E6  cmp         ebp,esp  
001A17E8  call        001A124E  
001A17ED  mov         esp,ebp  
001A17EF  pop         ebp  
001A17F0  ret  

///////////////////////////////////////////////////////////////////////////////////////////

int main(void)
{
001A18F0  push        ebp  
001A18F1  mov         ebp,esp  
001A18F3  sub         esp,0D8h  
001A18F9  push        ebx  
001A18FA  push        esi  
001A18FB  push        edi  
001A18FC  lea         edi,[ebp-18h]  
001A18FF  mov         ecx,6  
001A1904  mov         eax,0CCCCCCCCh  
001A1909  rep stos    dword ptr es:[edi]  
001A190B  mov         ecx,1AC008h  
001A1910  call        001A132F  
001A1915  nop  
	int num1 = 10;
001A1916  mov         dword ptr [ebp-8],0Ah  
	int num2 = 20;
001A191D  mov         dword ptr [ebp-14h],14h  
	printf("num1 num2: %d %d\n", num1, num2);
001A1924  mov         eax,dword ptr [ebp-14h]  
001A1927  push        eax  
001A1928  mov         ecx,dword ptr [ebp-8]  
001A192B  push        ecx  
001A192C  push        1A7B44h  
001A1931  call        001A10D2  
001A1936  add         esp,0Ch  

	Swap(num1, num2);			// num1과 num2에 저장된 값이 바뀌길 기대
001A1939  mov         eax,dword ptr [ebp-14h]  
001A193C  push        eax  
001A193D  mov         ecx,dword ptr [ebp-8]  
001A1940  push        ecx  
001A1941  call        001A1267  
001A1946  add         esp,8  
	printf("num1 num2: %d %d\n", num1, num2);
001A1949  mov         eax,dword ptr [ebp-14h]  
001A194C  push        eax  
001A194D  mov         ecx,dword ptr [ebp-8]  
001A1950  push        ecx  
001A1951  push        1A7B44h  
001A1956  call        001A10D2  
001A195B  add         esp,0Ch  

	return 0;
001A195E  xor         eax,eax  
}
001A1960  pop         edi  
001A1961  pop         esi  
001A1962  pop         ebx  
001A1963  add         esp,0D8h  
001A1969  cmp         ebp,esp  
001A196B  call        001A124E  
001A1970  mov         esp,ebp  
001A1972  pop         ebp  
001A1973  ret

 

 

#include <stdio.h>

void Swap(int n1, int n2)
{
00007FF6FE7C17B0  mov         dword ptr [rsp+10h],edx  
00007FF6FE7C17B4  mov         dword ptr [rsp+8],ecx  
00007FF6FE7C17B8  push        rbp  
00007FF6FE7C17B9  push        rdi  
00007FF6FE7C17BA  sub         rsp,108h  
00007FF6FE7C17C1  lea         rbp,[rsp+20h]  
00007FF6FE7C17C6  lea         rcx,[__ABC9C999_CallByValueSwap@c (07FF6FE7D2008h)]  
00007FF6FE7C17CD  call        __CheckForDebuggerJustMyCode (07FF6FE7C1370h)  
00007FF6FE7C17D2  nop  
	int temp = n1;
00007FF6FE7C17D3  mov         eax,dword ptr [n1]  
00007FF6FE7C17D9  mov         dword ptr [temp],eax  
	n1 = n2;
00007FF6FE7C17DC  mov         eax,dword ptr [n2]  
00007FF6FE7C17E2  mov         dword ptr [n1],eax  
	n2 = temp;
00007FF6FE7C17E8  mov         eax,dword ptr [temp]  
00007FF6FE7C17EB  mov         dword ptr [n2],eax  
	printf("n1, n2: %d %d\n", n1, n2);
00007FF6FE7C17F1  mov         r8d,dword ptr [n2]  
00007FF6FE7C17F8  mov         edx,dword ptr [n1]  
00007FF6FE7C17FE  lea         rcx,[string "n1, n2: %d %d\n" (07FF6FE7CAC28h)]  
00007FF6FE7C1805  call        printf (07FF6FE7C119Ah)  
00007FF6FE7C180A  nop  
}
00007FF6FE7C180B  lea         rsp,[rbp+0E8h]  
00007FF6FE7C1812  pop         rdi  
00007FF6FE7C1813  pop         rbp  
00007FF6FE7C1814  ret 

///////////////////////////////////////////////////////////////////////////////////////////

int main(void)
{
00007FF6FE7C1910  push        rbp  
00007FF6FE7C1912  push        rdi  
00007FF6FE7C1913  sub         rsp,128h  
00007FF6FE7C191A  lea         rbp,[rsp+20h]  
00007FF6FE7C191F  lea         rcx,[__ABC9C999_CallByValueSwap@c (07FF6FE7D2008h)]  
00007FF6FE7C1926  call        __CheckForDebuggerJustMyCode (07FF6FE7C1370h)  
00007FF6FE7C192B  nop  
	int num1 = 10;
00007FF6FE7C192C  mov         dword ptr [num1],0Ah  
	int num2 = 20;
00007FF6FE7C1933  mov         dword ptr [num2],14h  
	printf("num1 num2: %d %d\n", num1, num2);
00007FF6FE7C193A  mov         r8d,dword ptr [num2]  
00007FF6FE7C193E  mov         edx,dword ptr [num1]  
00007FF6FE7C1941  lea         rcx,[string "num1 num2: %d %d\n" (07FF6FE7CAC40h)]  
00007FF6FE7C1948  call        printf (07FF6FE7C119Ah)  
00007FF6FE7C194D  nop  

	Swap(num1, num2);			// num1과 num2에 저장된 값이 바뀌길 기대
00007FF6FE7C194E  mov         edx,dword ptr [num2]  
00007FF6FE7C1951  mov         ecx,dword ptr [num1]  
00007FF6FE7C1954  call        Swap (07FF6FE7C1186h)  
00007FF6FE7C1959  nop  
	printf("num1 num2: %d %d\n", num1, num2);
00007FF6FE7C195A  mov         r8d,dword ptr [num2]  
00007FF6FE7C195E  mov         edx,dword ptr [num1]  
00007FF6FE7C1961  lea         rcx,[string "num1 num2: %d %d\n" (07FF6FE7CAC40h)]  
00007FF6FE7C1968  call        printf (07FF6FE7C119Ah)  
00007FF6FE7C196D  nop  

	return 0;
00007FF6FE7C196E  xor         eax,eax  
}
00007FF6FE7C1970  lea         rsp,[rbp+108h]  
00007FF6FE7C1977  pop         rdi  
00007FF6FE7C1978  pop         rbp  
00007FF6FE7C1979  ret

 


 

#include <stdio.h>

void Swap(int* ptr1, int* ptr2)
{
00EA1790  push        ebp  
00EA1791  mov         ebp,esp  
00EA1793  sub         esp,0CCh  
00EA1799  push        ebx  
00EA179A  push        esi  
00EA179B  push        edi  
00EA179C  lea         edi,[ebp-0Ch]  
00EA179F  mov         ecx,3  
00EA17A4  mov         eax,0CCCCCCCCh  
00EA17A9  rep stos    dword ptr es:[edi]  
00EA17AB  mov         ecx,0EAC008h  
00EA17B0  call        00EA132F  
00EA17B5  nop  
	int temp = *ptr1;
00EA17B6  mov         eax,dword ptr [ebp+8]  
00EA17B9  mov         ecx,dword ptr [eax]  
00EA17BB  mov         dword ptr [ebp-8],ecx  
	*ptr1 = *ptr2;
00EA17BE  mov         eax,dword ptr [ebp+8]  
00EA17C1  mov         ecx,dword ptr [ebp+0Ch]  
00EA17C4  mov         edx,dword ptr [ecx]  
00EA17C6  mov         dword ptr [eax],edx  
	*ptr2 = *ptr1;
00EA17C8  mov         eax,dword ptr [ebp+0Ch]  
00EA17CB  mov         ecx,dword ptr [ebp+8]  
00EA17CE  mov         edx,dword ptr [ecx]  
00EA17D0  mov         dword ptr [eax],edx  
}
00EA17D2  pop         edi  
00EA17D3  pop         esi  
00EA17D4  pop         ebx  
00EA17D5  add         esp,0CCh  
00EA17DB  cmp         ebp,esp  
00EA17DD  call        00EA124E  
00EA17E2  mov         esp,ebp  
00EA17E4  pop         ebp  
00EA17E5  ret  

////////////////////////////////////////////////////////////////////////////////////////////

int main(void)
{
00EA4720  push        ebp  
00EA4721  mov         ebp,esp  
00EA4723  sub         esp,0D8h  
00EA4729  push        ebx  
00EA472A  push        esi  
00EA472B  push        edi  
00EA472C  lea         edi,[ebp-18h]  
00EA472F  mov         ecx,6  
00EA4734  mov         eax,0CCCCCCCCh  
00EA4739  rep stos    dword ptr es:[edi]  
00EA473B  mov         eax,dword ptr ds:[00EAA040h]  
00EA4740  xor         eax,ebp  
00EA4742  mov         dword ptr [ebp-4],eax  
00EA4745  mov         ecx,0EAC008h  
00EA474A  call        00EA132F  
00EA474F  nop  
	int num1 = 10;
00EA4750  mov         dword ptr [ebp-8],0Ah  
	int num2 = 20;
00EA4757  mov         dword ptr [ebp-14h],14h  
	printf("num1 num2: %d %d\n", num1, num2);
00EA475E  mov         eax,dword ptr [ebp-14h]  
00EA4761  push        eax  
00EA4762  mov         ecx,dword ptr [ebp-8]  
00EA4765  push        ecx  
00EA4766  push        0EA7B30h  
00EA476B  call        00EA10D2  
00EA4770  add         esp,0Ch  

	Swap(&num1, &num2);			// num1과 num2에 저장된 값이 바뀌길 기대
00EA4773  lea         eax,[ebp-14h]  
00EA4776  push        eax  
00EA4777  lea         ecx,[ebp-8]  
00EA477A  push        ecx  
00EA477B  call        00EA1267  
00EA4780  add         esp,8  
	printf("num1 num2: %d %d\n", num1, num2);
00EA4783  mov         eax,dword ptr [ebp-14h]  
00EA4786  push        eax  
00EA4787  mov         ecx,dword ptr [ebp-8]  
00EA478A  push        ecx  
00EA478B  push        0EA7B30h  
00EA4790  call        00EA10D2  
00EA4795  add         esp,0Ch  

	return 0;
00EA4798  xor         eax,eax  
}
00EA479A  push        edx  
00EA479B  mov         ecx,ebp  
00EA479D  push        eax  
00EA479E  lea         edx,ds:[00EA47CCh]  
00EA47A4  call        00EA11EA  
00EA47A9  pop         eax  
00EA47AA  pop         edx  
00EA47AB  pop         edi  
00EA47AC  pop         esi  
00EA47AD  pop         ebx  
00EA47AE  mov         ecx,dword ptr [ebp-4]  
00EA47B1  xor         ecx,ebp  
00EA47B3  call        00EA114F  
00EA47B8  add         esp,0D8h  
00EA47BE  cmp         ebp,esp  
00EA47C0  call        00EA124E  
00EA47C5  mov         esp,ebp  
00EA47C7  pop         ebp  
00EA47C8  ret

 

 

#include <stdio.h>

void Swap(int* ptr1, int* ptr2)
{
00007FF65BEA17B0  mov         qword ptr [rsp+10h],rdx  
00007FF65BEA17B5  mov         qword ptr [rsp+8],rcx  
00007FF65BEA17BA  push        rbp  
00007FF65BEA17BB  push        rdi  
00007FF65BEA17BC  sub         rsp,108h  
00007FF65BEA17C3  lea         rbp,[rsp+20h]  
00007FF65BEA17C8  lea         rcx,[__59B62D33_CallByRefSwap@c (07FF65BEB2008h)]  
00007FF65BEA17CF  call        __CheckForDebuggerJustMyCode (07FF65BEA1370h)  
00007FF65BEA17D4  nop  
	int temp = *ptr1;
00007FF65BEA17D5  mov         rax,qword ptr [ptr1]  
00007FF65BEA17DC  mov         eax,dword ptr [rax]  
00007FF65BEA17DE  mov         dword ptr [temp],eax  
	*ptr1 = *ptr2;
00007FF65BEA17E1  mov         rax,qword ptr [ptr1]  
00007FF65BEA17E8  mov         rcx,qword ptr [ptr2]  
00007FF65BEA17EF  mov         ecx,dword ptr [rcx]  
00007FF65BEA17F1  mov         dword ptr [rax],ecx  
	*ptr2 = *ptr1;
00007FF65BEA17F3  mov         rax,qword ptr [ptr2]  
00007FF65BEA17FA  mov         rcx,qword ptr [ptr1]  
00007FF65BEA1801  mov         ecx,dword ptr [rcx]  
00007FF65BEA1803  mov         dword ptr [rax],ecx  
}
00007FF65BEA1805  lea         rsp,[rbp+0E8h]  
00007FF65BEA180C  pop         rdi  
00007FF65BEA180D  pop         rbp  
00007FF65BEA180E  ret  

////////////////////////////////////////////////////////////////////////////////////////////

int main(void)
{
00007FF65BEA1910  push        rbp  
00007FF65BEA1912  push        rdi  
00007FF65BEA1913  sub         rsp,128h  
00007FF65BEA191A  lea         rbp,[rsp+20h]  
00007FF65BEA191F  lea         rdi,[rsp+20h]  
00007FF65BEA1924  mov         ecx,12h  
00007FF65BEA1929  mov         eax,0CCCCCCCCh  
00007FF65BEA192E  rep stos    dword ptr [rdi]  
00007FF65BEA1930  mov         rax,qword ptr [__security_cookie (07FF65BEAD000h)]  
00007FF65BEA1937  xor         rax,rbp  
00007FF65BEA193A  mov         qword ptr [rbp+0F8h],rax  
00007FF65BEA1941  lea         rcx,[__59B62D33_CallByRefSwap@c (07FF65BEB2008h)]  
00007FF65BEA1948  call        __CheckForDebuggerJustMyCode (07FF65BEA1370h)  
00007FF65BEA194D  nop  
	int num1 = 10;
00007FF65BEA194E  mov         dword ptr [num1],0Ah  
	int num2 = 20;
00007FF65BEA1955  mov         dword ptr [num2],14h  
	printf("num1 num2: %d %d\n", num1, num2);
00007FF65BEA195C  mov         r8d,dword ptr [num2]  
00007FF65BEA1960  mov         edx,dword ptr [num1]  
00007FF65BEA1963  lea         rcx,[string "num1 num2: %d %d\n" (07FF65BEAACF0h)]  
00007FF65BEA196A  call        printf (07FF65BEA119Ah)  
00007FF65BEA196F  nop  

	Swap(&num1, &num2);			// num1과 num2에 저장된 값이 바뀌길 기대
00007FF65BEA1970  lea         rdx,[num2]  
00007FF65BEA1974  lea         rcx,[num1]  
00007FF65BEA1978  call        Swap (07FF65BEA1186h)  
00007FF65BEA197D  nop  
	printf("num1 num2: %d %d\n", num1, num2);
00007FF65BEA197E  mov         r8d,dword ptr [num2]  
00007FF65BEA1982  mov         edx,dword ptr [num1]  
00007FF65BEA1985  lea         rcx,[string "num1 num2: %d %d\n" (07FF65BEAACF0h)]  
00007FF65BEA198C  call        printf (07FF65BEA119Ah)  
00007FF65BEA1991  nop  

	return 0;
00007FF65BEA1992  xor         eax,eax  
}
00007FF65BEA1994  mov         edi,eax  
00007FF65BEA1996  lea         rcx,[rbp-20h]  
00007FF65BEA199A  lea         rdx,[__xt_z+220h (07FF65BEAACC0h)]  
00007FF65BEA19A1  call        _RTC_CheckStackVars (07FF65BEA130Ch)  
00007FF65BEA19A6  mov         eax,edi  
00007FF65BEA19A8  mov         rcx,qword ptr [rbp+0F8h]  
00007FF65BEA19AF  xor         rcx,rbp  
00007FF65BEA19B2  call        __security_check_cookie (07FF65BEA11B3h)  
00007FF65BEA19B7  lea         rsp,[rbp+108h]  
00007FF65BEA19BE  pop         rdi  
00007FF65BEA19BF  pop         rbp  
00007FF65BEA19C0  ret