IT공부/IT서적

[윤성우 열혈 C프로그래밍] Chapter16, Chapter17, Chapter18, Chapter19

shine94 2025. 1. 29. 04:42

* 가로 행, 세로 열

 

* 3차원 배열

   자료형 이름[높이][행][열]

 

#include <stdio.h>

int main(void)
{
00A91960  push        ebp  
00A91961  mov         ebp,esp  
00A91963  sub         esp,110h  
00A91969  push        ebx  
00A9196A  push        esi  
00A9196B  push        edi  
00A9196C  lea         edi,[ebp-50h]  
00A9196F  mov         ecx,14h  
00A91974  mov         eax,0CCCCCCCCh  
00A91979  rep stos    dword ptr es:[edi]  
00A9197B  mov         eax,dword ptr [__security_cookie (0A9A000h)]  
00A91980  xor         eax,ebp  
00A91982  mov         dword ptr [ebp-4],eax  
00A91985  mov         ecx,offset _7C51B9D2_PopuResearch@c (0A9C008h)  
00A9198A  call        @__CheckForDebuggerJustMyCode@4 (0A91339h)  
00A9198F  nop  
	int villa[4][2];
	int popu, i, j;

	// 가구별 거주 인원 입력 받기
	for (i = 0; i < 4; i++)
00A91990  mov         dword ptr [i],0  
00A91997  jmp         __$EncStackInitStart+36h (0A919A2h)  
00A91999  mov         eax,dword ptr [i]  
00A9199C  add         eax,1  
00A9199F  mov         dword ptr [i],eax  
00A919A2  cmp         dword ptr [i],4  
00A919A6  jge         __$EncStackInitStart+8Eh (0A919FAh)  
	{
		for (j = 0; j < 2; j++)
00A919A8  mov         dword ptr [j],0  
00A919AF  jmp         __$EncStackInitStart+4Eh (0A919BAh)  
00A919B1  mov         eax,dword ptr [j]  
00A919B4  add         eax,1  
00A919B7  mov         dword ptr [j],eax  
00A919BA  cmp         dword ptr [j],2  
00A919BE  jge         __$EncStackInitStart+8Ch (0A919F8h)  
		{
			printf("%d층 %d호 인구수: ", i + 1, j + 1);
00A919C0  mov         eax,dword ptr [j]  
00A919C3  add         eax,1  
00A919C6  push        eax  
00A919C7  mov         ecx,dword ptr [i]  
00A919CA  add         ecx,1  
00A919CD  push        ecx  
00A919CE  push        offset string "%d\xc3\xfe %d\xc8\xa3 \xc0\xce\xb1\xb8\xbc\xf6: " (0A97B30h)  
00A919D3  call        _printf (0A910DCh)  
00A919D8  add         esp,0Ch  
			scanf_s("%d", &villa[i][j]);
00A919DB  mov         eax,dword ptr [i]  
00A919DE  lea         ecx,villa[eax*8]  
00A919E2  mov         edx,dword ptr [j]  
00A919E5  lea         eax,[ecx+edx*4]  
00A919E8  push        eax  
00A919E9  push        offset string "%d" (0A97B48h)  
00A919EE  call        _scanf_s (0A91294h)  
00A919F3  add         esp,8  
		}
00A919F6  jmp         __$EncStackInitStart+45h (0A919B1h)  
	}
00A919F8  jmp         __$EncStackInitStart+2Dh (0A91999h)  

	// 빌라의 층별 인구수 출력하기
	for (i = 0; i < 4; i++)
00A919FA  mov         dword ptr [i],0  
00A91A01  jmp         __$EncStackInitStart+0A0h (0A91A0Ch)  
00A91A03  mov         eax,dword ptr [i]  
00A91A06  add         eax,1  
00A91A09  mov         dword ptr [i],eax  
00A91A0C  cmp         dword ptr [i],4  
00A91A10  jge         __$EncStackInitStart+0F7h (0A91A63h)  
	{
		popu = 0;
00A91A12  mov         dword ptr [popu],0  
		popu += villa[i][0];
00A91A19  mov         eax,dword ptr [i]  
00A91A1C  lea         ecx,villa[eax*8]  
00A91A20  mov         edx,4  
00A91A25  imul        eax,edx,0  
00A91A28  mov         edx,dword ptr [popu]  
00A91A2B  add         edx,dword ptr [ecx+eax]  
00A91A2E  mov         dword ptr [popu],edx  
		popu += villa[i][1];
00A91A31  mov         eax,dword ptr [i]  
00A91A34  lea         ecx,villa[eax*8]  
00A91A38  mov         edx,4  
00A91A3D  shl         edx,0  
00A91A40  mov         eax,dword ptr [popu]  
00A91A43  add         eax,dword ptr [ecx+edx]  
00A91A46  mov         dword ptr [popu],eax  
		printf("%d층 인구수 : %d\n", i + 1, popu);
00A91A49  mov         eax,dword ptr [popu]  
00A91A4C  push        eax  
00A91A4D  mov         ecx,dword ptr [i]  
00A91A50  add         ecx,1  
00A91A53  push        ecx  
00A91A54  push        offset string "%d\xc3\xfe \xc0\xce\xb1\xb8\xbc\xf6 : %d\n" (0A97B4Ch)  
00A91A59  call        _printf (0A910DCh)  
00A91A5E  add         esp,0Ch  
	}
00A91A61  jmp         __$EncStackInitStart+97h (0A91A03h)  

	return 0;
00A91A63  xor         eax,eax  
}
00A91A65  push        edx  
00A91A66  mov         ecx,ebp  
00A91A68  push        eax  
00A91A69  lea         edx,ds:[0A91A94h]  
00A91A6F  call        @_RTC_CheckStackVars@8 (0A911F4h)  
00A91A74  pop         eax  
00A91A75  pop         edx  
00A91A76  pop         edi  
00A91A77  pop         esi  
00A91A78  pop         ebx  
00A91A79  mov         ecx,dword ptr [ebp-4]  
00A91A7C  xor         ecx,ebp  
00A91A7E  call        @__security_check_cookie@4 (0A91159h)  
00A91A83  add         esp,110h  
00A91A89  cmp         ebp,esp  
00A91A8B  call        __RTC_CheckEsp (0A91258h)  
00A91A90  mov         esp,ebp  
00A91A92  pop         ebp  
00A91A93  ret

 

#include <stdio.h>

int main(void)
{
00007FF6D65B1980  push        rbp  
00007FF6D65B1982  push        rdi  
00007FF6D65B1983  sub         rsp,188h  
00007FF6D65B198A  lea         rbp,[rsp+20h]  
00007FF6D65B198F  lea         rdi,[rsp+20h]  
00007FF6D65B1994  mov         ecx,2Ah  
00007FF6D65B1999  mov         eax,0CCCCCCCCh  
00007FF6D65B199E  rep stos    dword ptr [rdi]  
00007FF6D65B19A0  mov         rax,qword ptr [__security_cookie (07FF6D65BD000h)]  
00007FF6D65B19A7  xor         rax,rbp  
00007FF6D65B19AA  mov         qword ptr [rbp+158h],rax  
00007FF6D65B19B1  lea         rcx,[__7C51B9D2_PopuResearch@c (07FF6D65C2008h)]  
00007FF6D65B19B8  call        __CheckForDebuggerJustMyCode (07FF6D65B137Ah)  
00007FF6D65B19BD  nop  
	int villa[4][2];
	int popu, i, j;

	// 가구별 거주 인원 입력 받기
	for (i = 0; i < 4; i++)
00007FF6D65B19BE  mov         dword ptr [i],0  
00007FF6D65B19C5  jmp         __$EncStackInitStart+40h (07FF6D65B19CFh)  
00007FF6D65B19C7  mov         eax,dword ptr [i]  
00007FF6D65B19CA  inc         eax  
00007FF6D65B19CC  mov         dword ptr [i],eax  
00007FF6D65B19CF  cmp         dword ptr [i],4  
00007FF6D65B19D3  jge         __$EncStackInitStart+0B0h (07FF6D65B1A3Fh)  
	{
		for (j = 0; j < 2; j++)
00007FF6D65B19D5  mov         dword ptr [j],0  
00007FF6D65B19DF  jmp         __$EncStackInitStart+60h (07FF6D65B19EFh)  
00007FF6D65B19E1  mov         eax,dword ptr [j]  
00007FF6D65B19E7  inc         eax  
00007FF6D65B19E9  mov         dword ptr [j],eax  
00007FF6D65B19EF  cmp         dword ptr [j],2  
00007FF6D65B19F6  jge         __$EncStackInitStart+0AEh (07FF6D65B1A3Dh)  
		{
			printf("%d층 %d호 인구수: ", i + 1, j + 1);
00007FF6D65B19F8  mov         eax,dword ptr [j]  
00007FF6D65B19FE  inc         eax  
00007FF6D65B1A00  mov         ecx,dword ptr [i]  
00007FF6D65B1A03  inc         ecx  
00007FF6D65B1A05  mov         r8d,eax  
00007FF6D65B1A08  mov         edx,ecx  
00007FF6D65B1A0A  lea         rcx,[string "%d\xc3\xfe %d\xc8\xa3 \xc0\xce\xb1\xb8\xbc\xf6: " (07FF6D65BAD28h)]  
00007FF6D65B1A11  call        printf (07FF6D65B119Ah)  
00007FF6D65B1A16  nop  
			scanf_s("%d", &villa[i][j]);
00007FF6D65B1A17  movsxd      rax,dword ptr [i]  
00007FF6D65B1A1B  lea         rax,villa[rax*8]  
00007FF6D65B1A20  movsxd      rcx,dword ptr [j]  
00007FF6D65B1A27  lea         rax,[rax+rcx*4]  
00007FF6D65B1A2B  mov         rdx,rax  
00007FF6D65B1A2E  lea         rcx,[string "%d" (07FF6D65BAD40h)]  
00007FF6D65B1A35  call        scanf_s (07FF6D65B1203h)  
00007FF6D65B1A3A  nop  
		}
00007FF6D65B1A3B  jmp         __$EncStackInitStart+52h (07FF6D65B19E1h)  
	}
00007FF6D65B1A3D  jmp         __$EncStackInitStart+38h (07FF6D65B19C7h)  

	// 빌라의 층별 인구수 출력하기
	for (i = 0; i < 4; i++)
00007FF6D65B1A3F  mov         dword ptr [i],0  
00007FF6D65B1A46  jmp         __$EncStackInitStart+0C1h (07FF6D65B1A50h)  
00007FF6D65B1A48  mov         eax,dword ptr [i]  
00007FF6D65B1A4B  inc         eax  
00007FF6D65B1A4D  mov         dword ptr [i],eax  
00007FF6D65B1A50  cmp         dword ptr [i],4  
00007FF6D65B1A54  jge         __$EncStackInitStart+126h (07FF6D65B1AB5h)  
	{
		popu = 0;
00007FF6D65B1A56  mov         dword ptr [popu],0  
		popu += villa[i][0];
00007FF6D65B1A5D  movsxd      rax,dword ptr [i]  
00007FF6D65B1A61  lea         rax,villa[rax*8]  
00007FF6D65B1A66  mov         ecx,4  
00007FF6D65B1A6B  imul        rcx,rcx,0  
00007FF6D65B1A6F  mov         eax,dword ptr [rax+rcx]  
00007FF6D65B1A72  mov         ecx,dword ptr [popu]  
00007FF6D65B1A75  add         ecx,eax  
00007FF6D65B1A77  mov         eax,ecx  
00007FF6D65B1A79  mov         dword ptr [popu],eax  
		popu += villa[i][1];
00007FF6D65B1A7C  movsxd      rax,dword ptr [i]  
00007FF6D65B1A80  lea         rax,villa[rax*8]  
00007FF6D65B1A85  mov         ecx,4  
00007FF6D65B1A8A  imul        rcx,rcx,1  
00007FF6D65B1A8E  mov         eax,dword ptr [rax+rcx]  
00007FF6D65B1A91  mov         ecx,dword ptr [popu]  
00007FF6D65B1A94  add         ecx,eax  
00007FF6D65B1A96  mov         eax,ecx  
00007FF6D65B1A98  mov         dword ptr [popu],eax  
		printf("%d층 인구수 : %d\n", i + 1, popu);
00007FF6D65B1A9B  mov         eax,dword ptr [i]  
00007FF6D65B1A9E  inc         eax  
00007FF6D65B1AA0  mov         r8d,dword ptr [popu]  
00007FF6D65B1AA4  mov         edx,eax  
00007FF6D65B1AA6  lea         rcx,[string "%d\xc3\xfe \xc0\xce\xb1\xb8\xbc\xf6 : %d\n" (07FF6D65BAD48h)]  
00007FF6D65B1AAD  call        printf (07FF6D65B119Ah)  
00007FF6D65B1AB2  nop  
	}
00007FF6D65B1AB3  jmp         __$EncStackInitStart+0B9h (07FF6D65B1A48h)  

	return 0;
00007FF6D65B1AB5  xor         eax,eax  
}
00007FF6D65B1AB7  mov         edi,eax  
00007FF6D65B1AB9  lea         rcx,[rbp-20h]  
00007FF6D65B1ABD  lea         rdx,[__xt_z+260h (07FF6D65BAD00h)]  
00007FF6D65B1AC4  call        _RTC_CheckStackVars (07FF6D65B1316h)  
00007FF6D65B1AC9  mov         eax,edi  
00007FF6D65B1ACB  mov         rcx,qword ptr [rbp+158h]  
00007FF6D65B1AD2  xor         rcx,rbp  
00007FF6D65B1AD5  call        __security_check_cookie (07FF6D65B11B3h)  
00007FF6D65B1ADA  lea         rsp,[rbp+168h]  
00007FF6D65B1AE1  pop         rdi  
00007FF6D65B1AE2  pop         rbp  
00007FF6D65B1AE3  ret

 

* movsxd(MOVe with Sign eXtend)

   32비트 값을 64비트로 부호를 확장하여 복사

 


 

#include <stdio.h>

int main(void)
{
00F01870  push        ebp  
00F01871  mov         ebp,esp  
00F01873  sub         esp,0FCh  
00F01879  push        ebx  
00F0187A  push        esi  
00F0187B  push        edi  
00F0187C  lea         edi,[ebp-3Ch]  
00F0187F  mov         ecx,0Fh  
00F01884  mov         eax,0CCCCCCCCh  
00F01889  rep stos    dword ptr es:[edi]  
00F0188B  mov         eax,dword ptr [__security_cookie (0F0A000h)]  
00F01890  xor         eax,ebp  
00F01892  mov         dword ptr [ebp-4],eax  
00F01895  mov         ecx,offset _B7888422_TwoDimArrayAddr@c (0F0C008h)  
00F0189A  call        @__CheckForDebuggerJustMyCode@4 (0F0132Ah)  
00F0189F  nop  
	int arr[3][2];
	int i, j;

	for (i = 0; i < 3; i++)
00F018A0  mov         dword ptr [i],0  
00F018A7  jmp         __$EncStackInitStart+36h (0F018B2h)  
00F018A9  mov         eax,dword ptr [i]  
00F018AC  add         eax,1  
00F018AF  mov         dword ptr [i],eax  
00F018B2  cmp         dword ptr [i],3  
00F018B6  jge         __$EncStackInitStart+73h (0F018EFh)  
		for (j = 0; j < 2; j++)
00F018B8  mov         dword ptr [j],0  
00F018BF  jmp         __$EncStackInitStart+4Eh (0F018CAh)  
00F018C1  mov         eax,dword ptr [j]  
00F018C4  add         eax,1  
00F018C7  mov         dword ptr [j],eax  
00F018CA  cmp         dword ptr [j],2  
00F018CE  jge         __$EncStackInitStart+71h (0F018EDh)  
			printf("%p\n", &arr[i][j]);
00F018D0  mov         eax,dword ptr [i]  
00F018D3  lea         ecx,arr[eax*8]  
00F018D7  mov         edx,dword ptr [j]  
00F018DA  lea         eax,[ecx+edx*4]  
00F018DD  push        eax  
00F018DE  push        offset string "%p\n" (0F07B30h)  
00F018E3  call        _printf (0F010D2h)  
00F018E8  add         esp,8  
00F018EB  jmp         __$EncStackInitStart+45h (0F018C1h)  
00F018ED  jmp         __$EncStackInitStart+2Dh (0F018A9h)  

	return 0;
00F018EF  xor         eax,eax  
}
00F018F1  push        edx  
00F018F2  mov         ecx,ebp  
00F018F4  push        eax  
00F018F5  lea         edx,ds:[0F01920h]  
00F018FB  call        @_RTC_CheckStackVars@8 (0F011EAh)  
00F01900  pop         eax  
00F01901  pop         edx  
00F01902  pop         edi  
00F01903  pop         esi  
00F01904  pop         ebx  
00F01905  mov         ecx,dword ptr [ebp-4]  
00F01908  xor         ecx,ebp  
00F0190A  call        @__security_check_cookie@4 (0F0114Fh)  
00F0190F  add         esp,0FCh  
00F01915  cmp         ebp,esp  
00F01917  call        __RTC_CheckEsp (0F0124Eh)  
00F0191C  mov         esp,ebp  
00F0191E  pop         ebp  
00F0191F  ret

 

#include <stdio.h>

int main(void)
{
00007FF6DF621890  push        rbp  
00007FF6DF621892  push        rdi  
00007FF6DF621893  sub         rsp,158h  
00007FF6DF62189A  lea         rbp,[rsp+20h]  
00007FF6DF62189F  lea         rdi,[rsp+20h]  
00007FF6DF6218A4  mov         ecx,1Eh  
00007FF6DF6218A9  mov         eax,0CCCCCCCCh  
00007FF6DF6218AE  rep stos    dword ptr [rdi]  
00007FF6DF6218B0  mov         rax,qword ptr [__security_cookie (07FF6DF62D000h)]  
00007FF6DF6218B7  xor         rax,rbp  
00007FF6DF6218BA  mov         qword ptr [rbp+128h],rax  
00007FF6DF6218C1  lea         rcx,[__B7888422_TwoDimArrayAddr@c (07FF6DF632008h)]  
00007FF6DF6218C8  call        __CheckForDebuggerJustMyCode (07FF6DF62136Bh)  
00007FF6DF6218CD  nop  
	int arr[3][2];
	int i, j;

	for (i = 0; i < 3; i++)
00007FF6DF6218CE  mov         dword ptr [i],0  
00007FF6DF6218D5  jmp         __$EncStackInitStart+40h (07FF6DF6218DFh)  
00007FF6DF6218D7  mov         eax,dword ptr [i]  
00007FF6DF6218DA  inc         eax  
00007FF6DF6218DC  mov         dword ptr [i],eax  
00007FF6DF6218DF  cmp         dword ptr [i],3  
00007FF6DF6218E3  jge         __$EncStackInitStart+82h (07FF6DF621921h)  
		for (j = 0; j < 2; j++)
00007FF6DF6218E5  mov         dword ptr [j],0  
00007FF6DF6218EC  jmp         __$EncStackInitStart+57h (07FF6DF6218F6h)  
00007FF6DF6218EE  mov         eax,dword ptr [j]  
00007FF6DF6218F1  inc         eax  
00007FF6DF6218F3  mov         dword ptr [j],eax  
00007FF6DF6218F6  cmp         dword ptr [j],2  
00007FF6DF6218FA  jge         __$EncStackInitStart+80h (07FF6DF62191Fh)  
			printf("%p\n", &arr[i][j]);
00007FF6DF6218FC  movsxd      rax,dword ptr [i]  
00007FF6DF621900  lea         rax,arr[rax*8]  
00007FF6DF621905  movsxd      rcx,dword ptr [j]  
00007FF6DF621909  lea         rax,[rax+rcx*4]  
00007FF6DF62190D  mov         rdx,rax  
00007FF6DF621910  lea         rcx,[string "%p\n" (07FF6DF62ACA4h)]  
00007FF6DF621917  call        printf (07FF6DF621195h)  
00007FF6DF62191C  nop  
00007FF6DF62191D  jmp         __$EncStackInitStart+4Fh (07FF6DF6218EEh)  
00007FF6DF62191F  jmp         __$EncStackInitStart+38h (07FF6DF6218D7h)  

	return 0;
00007FF6DF621921  xor         eax,eax  
}
00007FF6DF621923  mov         edi,eax  
00007FF6DF621925  lea         rcx,[rbp-20h]  
00007FF6DF621929  lea         rdx,[__xt_z+1E0h (07FF6DF62AC80h)]  
00007FF6DF621930  call        _RTC_CheckStackVars (07FF6DF621307h)  
00007FF6DF621935  mov         eax,edi  
00007FF6DF621937  mov         rcx,qword ptr [rbp+128h]  
00007FF6DF62193E  xor         rcx,rbp  
00007FF6DF621941  call        __security_check_cookie (07FF6DF6211AEh)  
00007FF6DF621946  lea         rsp,[rbp+138h]  
00007FF6DF62194D  pop         rdi  
00007FF6DF62194E  pop         rbp  
00007FF6DF62194F  ret

 


 

* 이중 포인터(= 더블 포인터)

   포인터의 포인터

   포인터 변수를 가리키는 또 다른 포인터 변수

 

* *(*dptr) == **dptr

 

#include <stdio.h>

int main(void)
{
00F855F0  push        ebp  
00F855F1  mov         ebp,esp  
00F855F3  sub         esp,0F8h  
00F855F9  push        ebx  
00F855FA  push        esi  
00F855FB  push        edi  
00F855FC  lea         edi,[ebp-38h]  
00F855FF  mov         ecx,0Eh  
00F85604  mov         eax,0CCCCCCCCh  
00F85609  rep stos    dword ptr es:[edi]  
00F8560B  mov         eax,dword ptr [__security_cookie (0F8A000h)]  
00F85610  xor         eax,ebp  
00F85612  mov         dword ptr [ebp-4],eax  
00F85615  mov         ecx,offset _E110EADE_DoublePointerAccess@c (0F8C008h)  
00F8561A  call        @__CheckForDebuggerJustMyCode@4 (0F8132Ah)  
00F8561F  nop  
	double num = 3.14;
00F85620  movsd       xmm0,mmword ptr [__real@40091eb851eb851f (0F87C00h)]  
00F85628  movsd       mmword ptr [num],xmm0  
	double* ptr = &num;
00F8562D  lea         eax,[num]  
00F85630  mov         dword ptr [ptr],eax  
	double** dptr = &ptr;
00F85633  lea         eax,[ptr]  
00F85636  mov         dword ptr [dptr],eax  
	double* ptr2;

	printf("%9p %9p\n", ptr, *dptr);
00F85639  mov         eax,dword ptr [dptr]  
00F8563C  mov         ecx,dword ptr [eax]  
00F8563E  push        ecx  
00F8563F  mov         edx,dword ptr [ptr]  
00F85642  push        edx  
00F85643  push        offset string "%9p %9p\n" (0F87B30h)  
00F85648  call        _printf (0F810D2h)  
00F8564D  add         esp,0Ch  
	printf("%9g %9g\n", num, **dptr);
00F85650  mov         eax,dword ptr [dptr]  
00F85653  mov         ecx,dword ptr [eax]  
00F85655  sub         esp,8  
00F85658  movsd       xmm0,mmword ptr [ecx]  
00F8565C  movsd       mmword ptr [esp],xmm0  
00F85661  sub         esp,8  
00F85664  movsd       xmm0,mmword ptr [num]  
00F85669  movsd       mmword ptr [esp],xmm0  
00F8566E  push        offset string "%9g %9g\n" (0F87BE8h)  
00F85673  call        _printf (0F810D2h)  
00F85678  add         esp,14h  

	printf("\nnum의 주소 : %p(%d),  ptr의 주소 : %p, ptr2의 주소 %p, dptr의 주소 : %p\n\n", 
00F8567B  lea         eax,[dptr]  
00F8567E  push        eax  
00F8567F  lea         ecx,[ptr2]  
00F85682  push        ecx  
00F85683  lea         edx,[ptr]  
00F85686  push        edx  
00F85687  lea         eax,[num]  
00F8568A  push        eax  
00F8568B  lea         ecx,[num]  
00F8568E  push        ecx  
00F8568F  push        offset string "\nnum\xc0\xc7 \xc1\xd6\xbc\xd2 : %p(%d),  ptr\xc0\xc7 \xc1\xd6@"... (0F88620h)  
00F85694  call        _printf (0F810D2h)  
00F85699  add         esp,18h  
		&num, &num, &ptr, &ptr2, &dptr);

	ptr2 = *dptr;
00F8569C  mov         eax,dword ptr [dptr]  
00F8569F  mov         ecx,dword ptr [eax]  
00F856A1  mov         dword ptr [ptr2],ecx  
	*ptr2 = 10.99;
00F856A4  mov         eax,dword ptr [ptr2]  
00F856A7  movsd       xmm0,mmword ptr [__real@4025fae147ae147b (0F87B40h)]  
00F856AF  movsd       mmword ptr [eax],xmm0  
	printf("%9g %9g %9g\n", num, **dptr, *ptr2);
00F856B3  mov         eax,dword ptr [ptr2]  
00F856B6  sub         esp,8  
00F856B9  movsd       xmm0,mmword ptr [eax]  
00F856BD  movsd       mmword ptr [esp],xmm0  
00F856C2  mov         ecx,dword ptr [dptr]  
00F856C5  mov         edx,dword ptr [ecx]  
00F856C7  sub         esp,8  
00F856CA  movsd       xmm0,mmword ptr [edx]  
00F856CE  movsd       mmword ptr [esp],xmm0  
00F856D3  sub         esp,8  
00F856D6  movsd       xmm0,mmword ptr [num]  
00F856DB  movsd       mmword ptr [esp],xmm0  
00F856E0  push        offset string "%9g %9g %9g\n" (0F87CE8h)  
00F856E5  call        _printf (0F810D2h)  
00F856EA  add         esp,1Ch  

	return 0;
00F856ED  xor         eax,eax  
}
00F856EF  push        edx  
00F856F0  mov         ecx,ebp  
00F856F2  push        eax  
00F856F3  lea         edx,ds:[0F85720h]  
00F856F9  call        @_RTC_CheckStackVars@8 (0F811EAh)  
00F856FE  pop         eax  
00F856FF  pop         edx  
00F85700  pop         edi  
00F85701  pop         esi  
00F85702  pop         ebx  
00F85703  mov         ecx,dword ptr [ebp-4]  
00F85706  xor         ecx,ebp  
00F85708  call        @__security_check_cookie@4 (0F8114Fh)  
00F8570D  add         esp,0F8h  
00F85713  cmp         ebp,esp  
00F85715  call        __RTC_CheckEsp (0F8124Eh)  
00F8571A  mov         esp,ebp  
00F8571C  pop         ebp  
00F8571D  ret

 

* printf("%9p %9p\n", ptr, *dptr);

   (1) 

   00F85639  mov         eax,dword ptr [dptr]  
   00F8563C  mov         ecx,dword ptr [eax]  
   00F8563E  push        ecx  

   (2) 

   00F8563F  mov         edx,dword ptr [ptr]  
   00F85642  push        edx  

 

#include <stdio.h>

int main(void)
{
00007FF6BCFD1890  push        rbp  
00007FF6BCFD1892  push        rdi  
00007FF6BCFD1893  sub         rsp,178h  
00007FF6BCFD189A  lea         rbp,[rsp+30h]  
00007FF6BCFD189F  lea         rdi,[rsp+30h]  
00007FF6BCFD18A4  mov         ecx,22h  
00007FF6BCFD18A9  mov         eax,0CCCCCCCCh  
00007FF6BCFD18AE  rep stos    dword ptr [rdi]  
00007FF6BCFD18B0  mov         rax,qword ptr [__security_cookie (07FF6BCFDD000h)]  
00007FF6BCFD18B7  xor         rax,rbp  
00007FF6BCFD18BA  mov         qword ptr [rbp+138h],rax  
00007FF6BCFD18C1  lea         rcx,[__E110EADE_DoublePointerAccess@c (07FF6BCFE2008h)]  
00007FF6BCFD18C8  call        __CheckForDebuggerJustMyCode (07FF6BCFD136Bh)  
00007FF6BCFD18CD  nop  
	double num = 3.14;
00007FF6BCFD18CE  movsd       xmm0,mmword ptr [__real@40091eb851eb851f (07FF6BCFDAE30h)]  
00007FF6BCFD18D6  movsd       mmword ptr [num],xmm0  
	double* ptr = &num;
00007FF6BCFD18DB  lea         rax,[num]  
00007FF6BCFD18DF  mov         qword ptr [ptr],rax  
	double** dptr = &ptr;
00007FF6BCFD18E3  lea         rax,[ptr]  
00007FF6BCFD18E7  mov         qword ptr [dptr],rax  
	double* ptr2;

	printf("%9p %9p\n", ptr, *dptr);
00007FF6BCFD18EB  mov         rax,qword ptr [dptr]  
00007FF6BCFD18EF  mov         r8,qword ptr [rax]  
00007FF6BCFD18F2  mov         rdx,qword ptr [ptr]  
00007FF6BCFD18F6  lea         rcx,[string "%9p %9p\n" (07FF6BCFDADA0h)]  
00007FF6BCFD18FD  call        printf (07FF6BCFD1195h)  
00007FF6BCFD1902  nop  
	printf("%9g %9g\n", num, **dptr);
00007FF6BCFD1903  mov         rax,qword ptr [dptr]  
00007FF6BCFD1907  mov         rax,qword ptr [rax]  
00007FF6BCFD190A  movsd       xmm2,mmword ptr [rax]  
00007FF6BCFD190E  movq        r8,xmm2  
00007FF6BCFD1913  movsd       xmm1,mmword ptr [num]  
00007FF6BCFD1918  movq        rdx,xmm1  
00007FF6BCFD191D  lea         rcx,[string "%9g %9g\n" (07FF6BCFDADB0h)]  
00007FF6BCFD1924  call        printf (07FF6BCFD1195h)  
00007FF6BCFD1929  nop  

	printf("\nnum의 주소 : %p(%d),  ptr의 주소 : %p, ptr2의 주소 %p, dptr의 주소 : %p\n\n", 
00007FF6BCFD192A  lea         rax,[dptr]  
00007FF6BCFD192E  mov         qword ptr [rsp+28h],rax  
00007FF6BCFD1933  lea         rax,[ptr2]  
00007FF6BCFD1937  mov         qword ptr [rsp+20h],rax  
00007FF6BCFD193C  lea         r9,[ptr]  
00007FF6BCFD1940  lea         r8,[num]  
00007FF6BCFD1944  lea         rdx,[num]  
00007FF6BCFD1948  lea         rcx,[string "\nnum\xc0\xc7 \xc1\xd6\xbc\xd2 : %p(%d),  ptr\xc0\xc7 \xc1\xd6@"... (07FF6BCFDADC0h)]  
00007FF6BCFD194F  call        printf (07FF6BCFD1195h)  
00007FF6BCFD1954  nop  
		&num, &num, &ptr, &ptr2, &dptr);

	ptr2 = *dptr;
00007FF6BCFD1955  mov         rax,qword ptr [dptr]  
00007FF6BCFD1959  mov         rax,qword ptr [rax]  
00007FF6BCFD195C  mov         qword ptr [ptr2],rax  
	*ptr2 = 10.99;
00007FF6BCFD1960  mov         rax,qword ptr [ptr2]  
00007FF6BCFD1964  movsd       xmm0,mmword ptr [__real@4025fae147ae147b (07FF6BCFDAE40h)]  
00007FF6BCFD196C  movsd       mmword ptr [rax],xmm0  
	printf("%9g %9g %9g\n", num, **dptr, *ptr2);
00007FF6BCFD1970  mov         rax,qword ptr [dptr]  
00007FF6BCFD1974  mov         rax,qword ptr [rax]  
00007FF6BCFD1977  mov         rcx,qword ptr [ptr2]  
00007FF6BCFD197B  movsd       xmm3,mmword ptr [rcx]  
00007FF6BCFD197F  movq        r9,xmm3  
00007FF6BCFD1984  movsd       xmm2,mmword ptr [rax]  
00007FF6BCFD1988  movq        r8,xmm2  
00007FF6BCFD198D  movsd       xmm1,mmword ptr [num]  
00007FF6BCFD1992  movq        rdx,xmm1  
00007FF6BCFD1997  lea         rcx,[string "%9g %9g %9g\n" (07FF6BCFDAE20h)]  
00007FF6BCFD199E  call        printf (07FF6BCFD1195h)  
00007FF6BCFD19A3  nop  

	return 0;
00007FF6BCFD19A4  xor         eax,eax  
}
00007FF6BCFD19A6  mov         edi,eax  
00007FF6BCFD19A8  lea         rcx,[rbp-30h]  
00007FF6BCFD19AC  lea         rdx,[__xt_z+2B0h (07FF6BCFDAD50h)]  
00007FF6BCFD19B3  call        _RTC_CheckStackVars (07FF6BCFD1307h)  
00007FF6BCFD19B8  mov         eax,edi  
00007FF6BCFD19BA  mov         rcx,qword ptr [rbp+138h]  
00007FF6BCFD19C1  xor         rcx,rbp  
00007FF6BCFD19C4  call        __security_check_cookie (07FF6BCFD11AEh)  
00007FF6BCFD19C9  lea         rsp,[rbp+148h]  
00007FF6BCFD19D0  pop         rdi  
00007FF6BCFD19D1  pop         rbp  
00007FF6BCFD19D2  ret

 

* movq 명령어

   64비트 데이터를 복사하거나 이동

 


 

#include <stdio.h>

int main(void)
{
003E1870  push        ebp  
003E1871  mov         ebp,esp  
003E1873  sub         esp,12Ch  
003E1879  push        ebx  
003E187A  push        esi  
003E187B  push        edi  
003E187C  lea         edi,[ebp-6Ch]  
003E187F  mov         ecx,1Bh  
003E1884  mov         eax,0CCCCCCCCh  
003E1889  rep stos    dword ptr es:[edi]  
003E188B  mov         eax,dword ptr [__security_cookie (03EA000h)]  
003E1890  xor         eax,ebp  
003E1892  mov         dword ptr [ebp-4],eax  
003E1895  mov         ecx,offset _B586263E_PointerArrayType@c (03EC008h)  
003E189A  call        @__CheckForDebuggerJustMyCode@4 (03E132Ah)  
003E189F  nop  
	int num1 = 10, num2 = 20, num3 = 30;
003E18A0  mov         dword ptr [num1],0Ah  
003E18A7  mov         dword ptr [num2],14h  
003E18AE  mov         dword ptr [num3],1Eh  
	int* ptr1 = &num1;
003E18B5  lea         eax,[num1]  
003E18B8  mov         dword ptr [ptr1],eax  
	int* ptr2 = &num2;
003E18BB  lea         eax,[num2]  
003E18BE  mov         dword ptr [ptr2],eax  
	int* ptr3 = &num3;
003E18C1  lea         eax,[num3]  
003E18C4  mov         dword ptr [ptr3],eax  

	int* ptrArr[] = { ptr1, ptr2, ptr3 };
003E18C7  mov         eax,dword ptr [ptr1]  
003E18CA  mov         dword ptr [ptrArr],eax  
003E18CD  mov         eax,dword ptr [ptr2]  
003E18D0  mov         dword ptr [ebp-58h],eax  
003E18D3  mov         eax,dword ptr [ptr3]  
003E18D6  mov         dword ptr [ebp-54h],eax  
	int** dptr = ptrArr;
003E18D9  lea         eax,[ptrArr]  
003E18DC  mov         dword ptr [dptr],eax  

	printf("%d %d %d\n", *(ptrArr[0]), *(ptrArr[1]), *(ptrArr[2]));
003E18DF  mov         eax,4  
003E18E4  shl         eax,1  
003E18E6  mov         ecx,dword ptr ptrArr[eax]  
003E18EA  mov         edx,dword ptr [ecx]  
003E18EC  push        edx  
003E18ED  mov         eax,4  
003E18F2  shl         eax,0  
003E18F5  mov         ecx,dword ptr ptrArr[eax]  
003E18F9  mov         edx,dword ptr [ecx]  
003E18FB  push        edx  
003E18FC  mov         eax,4  
003E1901  imul        ecx,eax,0  
003E1904  mov         edx,dword ptr ptrArr[ecx]  
003E1908  mov         eax,dword ptr [edx]  
003E190A  push        eax  
003E190B  push        offset string "%d %d %d\n" (03E7B30h)  
003E1910  call        _printf (03E10D2h)  
003E1915  add         esp,10h  
	printf("%d %d %d\n", *(dptr[0]), *(dptr[1]), *(dptr[2]));
003E1918  mov         eax,4  
003E191D  shl         eax,1  
003E191F  mov         ecx,dword ptr [dptr]  
003E1922  mov         edx,dword ptr [ecx+eax]  
003E1925  mov         eax,dword ptr [edx]  
003E1927  push        eax  
003E1928  mov         ecx,4  
003E192D  shl         ecx,0  
003E1930  mov         edx,dword ptr [dptr]  
003E1933  mov         eax,dword ptr [edx+ecx]  
003E1936  mov         ecx,dword ptr [eax]  
003E1938  push        ecx  
003E1939  mov         edx,4  
003E193E  imul        eax,edx,0  
003E1941  mov         ecx,dword ptr [dptr]  
003E1944  mov         edx,dword ptr [ecx+eax]  
003E1947  mov         eax,dword ptr [edx]  
003E1949  push        eax  
003E194A  push        offset string "%d %d %d\n" (03E7B30h)  
003E194F  call        _printf (03E10D2h)  
003E1954  add         esp,10h  

	return 0;
003E1957  xor         eax,eax  
}
003E1959  push        edx  
003E195A  mov         ecx,ebp  
003E195C  push        eax  
003E195D  lea         edx,ds:[3E1988h]  
003E1963  call        @_RTC_CheckStackVars@8 (03E11EAh)  
003E1968  pop         eax  
003E1969  pop         edx  
003E196A  pop         edi  
003E196B  pop         esi  
003E196C  pop         ebx  
003E196D  mov         ecx,dword ptr [ebp-4]  
003E1970  xor         ecx,ebp  
003E1972  call        @__security_check_cookie@4 (03E114Fh)  
003E1977  add         esp,12Ch  
003E197D  cmp         ebp,esp  
003E197F  call        __RTC_CheckEsp (03E124Eh)  
003E1984  mov         esp,ebp  
003E1986  pop         ebp  
003E1987  ret

 


 

#include <stdio.h>

int main(void)
{
00335600  push        ebp  
00335601  mov         ebp,esp  
00335603  sub         esp,104h  
00335609  push        ebx  
0033560A  push        esi  
0033560B  push        edi  
0033560C  lea         edi,[ebp-44h]  
0033560F  mov         ecx,11h  
00335614  mov         eax,0CCCCCCCCh  
00335619  rep stos    dword ptr es:[edi]  
0033561B  mov         eax,dword ptr [__security_cookie (033A000h)]  
00335620  xor         eax,ebp  
00335622  mov         dword ptr [ebp-4],eax  
00335625  mov         ecx,offset _E2B4C1F4_2DArrPointer@c (033C008h)  
0033562A  call        @__CheckForDebuggerJustMyCode@4 (033132Ah)  
0033562F  nop  
	int arr1[3][2];
	int arr2[2][3];

	printf("arr1 : %p\n\n", arr1);
00335630  lea         eax,[arr1]  
00335633  push        eax  
00335634  push        offset string "arr1 : %p\n\n" (0337B30h)  
00335639  call        _printf (03310D2h)  
0033563E  add         esp,8  

	printf("arr1 + 1 : %p\n", arr1 + 1);
00335641  lea         eax,[ebp-18h]  
00335644  push        eax  
00335645  push        offset string "arr1 + 1 : %p\n" (0337B40h)  
0033564A  call        _printf (03310D2h)  
0033564F  add         esp,8  
	printf("arr1 + 2 : %p\n\n", arr1 + 2);
00335652  lea         eax,[ebp-10h]  
00335655  push        eax  
00335656  push        offset string "arr1 + 2 : %p\n\n" (0337B54h)  
0033565B  call        _printf (03310D2h)  
00335660  add         esp,8  

	printf("arr2 : %p\n", arr2);
00335663  lea         eax,[arr2]  
00335666  push        eax  
00335667  push        offset string "arr2 : %p\n" (0337D40h)  
0033566C  call        _printf (03310D2h)  
00335671  add         esp,8  
	printf("arr2 + 1 : %p\n", arr2 + 1);
00335674  lea         eax,[ebp-34h]  
00335677  push        eax  
00335678  push        offset string "arr2 + 1 : %p\n" (0337B78h)  
0033567D  call        _printf (03310D2h)  
00335682  add         esp,8  
	printf("arr2 + 2 : %p\n\n", arr2 + 2);
00335685  lea         eax,[ebp-28h]  
00335688  push        eax  
00335689  push        offset string "arr2 + 2 : %p\n\n" (0337B8Ch)  
0033568E  call        _printf (03310D2h)  
00335693  add         esp,8  

	printf("(arr1 + 1)[0] : %p\n", (arr1 + 1)[0]);
00335696  mov         eax,8  
0033569B  imul        ecx,eax,0  
0033569E  lea         edx,[ebp+ecx-18h]  
003356A2  push        edx  
003356A3  push        offset string "(arr1 + 1)[0] : %p\n" (0337B64h)  
003356A8  call        _printf (03310D2h)  
003356AD  add         esp,8  
	printf("(arr1 + 1)[1] : %p\n\n", (arr1 + 1)[1]);
003356B0  mov         eax,8  
003356B5  shl         eax,0  
003356B8  lea         ecx,[ebp+eax-18h]  
003356BC  push        ecx  
003356BD  push        offset string "(arr1 + 1)[1] : %p\n\n" (0337C3Ch)  
003356C2  call        _printf (03310D2h)  
003356C7  add         esp,8  

	printf("(arr1 + 2)[0] : %p\n", (arr1 + 2)[0]);
003356CA  mov         eax,8  
003356CF  imul        ecx,eax,0  
003356D2  lea         edx,[ebp+ecx-10h]  
003356D6  push        edx  
003356D7  push        offset string "(arr1 + 2)[0] : %p\n" (0337D4Ch)  
003356DC  call        _printf (03310D2h)  
003356E1  add         esp,8  
	printf("(arr1 + 2)[1] : %p\n\n", (arr1 + 2)[1]);
003356E4  mov         eax,8  
003356E9  shl         eax,0  
003356EC  lea         ecx,[ebp+eax-10h]  
003356F0  push        ecx  
003356F1  push        offset string "(arr1 + 2)[1] : %p\n\n" (0337E90h)  
003356F6  call        _printf (03310D2h)  
003356FB  add         esp,8  

	printf("(arr1 + 1)[4] : %p\n", (arr1 + 1)[4]);
003356FE  mov         eax,8  
00335703  shl         eax,2  
00335706  lea         ecx,[ebp+eax-18h]  
0033570A  push        ecx  
0033570B  push        offset string "(arr1 + 1)[4] : %p\n" (0337EA8h)  
00335710  call        _printf (03310D2h)  
00335715  add         esp,8  
	printf("(arr1 + 2)[4] : %p\n\n", (arr1 + 2)[4]);
00335718  mov         eax,8  
0033571D  shl         eax,2  
00335720  lea         ecx,[ebp+eax-10h]  
00335724  push        ecx  
00335725  push        offset string "(arr1 + 2)[4] : %p\n\n" (0337FF4h)  
0033572A  call        _printf (03310D2h)  
0033572F  add         esp,8  

	return 0;
00335732  xor         eax,eax  
}
00335734  push        edx  
00335735  mov         ecx,ebp  
00335737  push        eax  
00335738  lea         edx,ds:[335764h]  
0033573E  call        @_RTC_CheckStackVars@8 (03311EAh)  
00335743  pop         eax  
00335744  pop         edx  
00335745  pop         edi  
00335746  pop         esi  
00335747  pop         ebx  
00335748  mov         ecx,dword ptr [ebp-4]  
0033574B  xor         ecx,ebp  
0033574D  call        @__security_check_cookie@4 (033114Fh)  
00335752  add         esp,104h  
00335758  cmp         ebp,esp  
0033575A  call        __RTC_CheckEsp (033124Eh)  
0033575F  mov         esp,ebp  
00335761  pop         ebp  
00335762  ret

 


 

#include <stdio.h>

int main(void)
{
00421870  push        ebp  
00421871  mov         ebp,esp  
00421873  sub         esp,13Ch  
00421879  push        ebx  
0042187A  push        esi  
0042187B  push        edi  
0042187C  lea         edi,[ebp-7Ch]  
0042187F  mov         ecx,1Fh  
00421884  mov         eax,0CCCCCCCCh  
00421889  rep stos    dword ptr es:[edi]  
0042188B  mov         eax,dword ptr [__security_cookie (042A000h)]  
00421890  xor         eax,ebp  
00421892  mov         dword ptr [ebp-4],eax  
00421895  mov         ecx,offset _15A98840_2DArrNameAndArrPtr@c (042C008h)  
0042189A  call        @__CheckForDebuggerJustMyCode@4 (042132Ah)  
0042189F  nop  
	int arr1[2][2] = {
004218A0  mov         dword ptr [arr1],1  
004218A7  mov         dword ptr [ebp-14h],2  
004218AE  mov         dword ptr [ebp-10h],3  
004218B5  mov         dword ptr [ebp-0Ch],4  
		{1, 2}, {3, 4}
	};

	int arr2[3][2] = {
004218BC  mov         dword ptr [arr2],1  
004218C3  mov         dword ptr [ebp-34h],2  
004218CA  mov         dword ptr [ebp-30h],3  
004218D1  mov         dword ptr [ebp-2Ch],4  
004218D8  mov         dword ptr [ebp-28h],3  
004218DF  mov         dword ptr [ebp-24h],6  
		{1, 2}, {3, 4}, {3, 6}
	};

	int arr3[4][2] = {
004218E6  mov         dword ptr [arr3],1  
004218ED  mov         dword ptr [ebp-5Ch],2  
004218F4  mov         dword ptr [ebp-58h],3  
004218FB  mov         dword ptr [ebp-54h],4  
00421902  mov         dword ptr [ebp-50h],3  
00421909  mov         dword ptr [ebp-4Ch],6  
00421910  mov         dword ptr [ebp-48h],7  
00421917  mov         dword ptr [ebp-44h],8  
		{1, 2}, {3, 4}, {3, 6}, {7, 8}
	};

	int (*ptr)[2];
	int i;

	ptr = arr1;
0042191E  lea         eax,[arr1]  
00421921  mov         dword ptr [ptr],eax  
	printf("** Show 2, 2 arr1\n");
00421924  push        offset string "** Show 2, 2 arr1\n" (0427B30h)  
00421929  call        _printf (04210D2h)  
0042192E  add         esp,4  
	for (i = 0; i < 2; i++)
00421931  mov         dword ptr [i],0  
00421938  jmp         __$EncStackInitStart+0C7h (0421943h)  
0042193A  mov         eax,dword ptr [i]  
0042193D  add         eax,1  
00421940  mov         dword ptr [i],eax  
00421943  cmp         dword ptr [i],2  
00421947  jge         __$EncStackInitStart+106h (0421982h)  
		printf("%d %d\n", ptr[i][0], ptr[i][1]);
00421949  mov         eax,dword ptr [i]  
0042194C  mov         ecx,dword ptr [ptr]  
0042194F  lea         edx,[ecx+eax*8]  
00421952  mov         eax,4  
00421957  shl         eax,0  
0042195A  mov         ecx,dword ptr [edx+eax]  
0042195D  push        ecx  
0042195E  mov         edx,dword ptr [i]  
00421961  mov         eax,dword ptr [ptr]  
00421964  lea         ecx,[eax+edx*8]  
00421967  mov         edx,4  
0042196C  imul        eax,edx,0  
0042196F  mov         ecx,dword ptr [ecx+eax]  
00421972  push        ecx  
00421973  push        offset string "%d %d\n" (0427B48h)  
00421978  call        _printf (04210D2h)  
0042197D  add         esp,0Ch  
00421980  jmp         __$EncStackInitStart+0BEh (042193Ah)  

	ptr = arr2;
00421982  lea         eax,[arr2]  
00421985  mov         dword ptr [ptr],eax  
	printf("** Show 3, 2 arr1\n");
00421988  push        offset string "** Show 3, 2 arr1\n" (0427B50h)  
0042198D  call        _printf (04210D2h)  
00421992  add         esp,4  
	for (i = 0; i < 3; i++)
00421995  mov         dword ptr [i],0  
0042199C  jmp         __$EncStackInitStart+12Bh (04219A7h)  
0042199E  mov         eax,dword ptr [i]  
004219A1  add         eax,1  
004219A4  mov         dword ptr [i],eax  
004219A7  cmp         dword ptr [i],3  
004219AB  jge         __$EncStackInitStart+16Ah (04219E6h)  
		printf("%d %d\n", ptr[i][0], ptr[i][1]);
004219AD  mov         eax,dword ptr [i]  
004219B0  mov         ecx,dword ptr [ptr]  
004219B3  lea         edx,[ecx+eax*8]  
004219B6  mov         eax,4  
004219BB  shl         eax,0  
004219BE  mov         ecx,dword ptr [edx+eax]  
004219C1  push        ecx  
004219C2  mov         edx,dword ptr [i]  
004219C5  mov         eax,dword ptr [ptr]  
004219C8  lea         ecx,[eax+edx*8]  
004219CB  mov         edx,4  
004219D0  imul        eax,edx,0  
004219D3  mov         ecx,dword ptr [ecx+eax]  
004219D6  push        ecx  
004219D7  push        offset string "%d %d\n" (0427B48h)  
004219DC  call        _printf (04210D2h)  
004219E1  add         esp,0Ch  
004219E4  jmp         __$EncStackInitStart+122h (042199Eh)  

	ptr = arr3;
004219E6  lea         eax,[arr3]  
004219E9  mov         dword ptr [ptr],eax  
	printf("** Show 4, 2 arr1\n");
004219EC  push        offset string "** Show 4, 2 arr1\n" (0427B68h)  
004219F1  call        _printf (04210D2h)  
004219F6  add         esp,4  
	for (i = 0; i < 4; i++)
004219F9  mov         dword ptr [i],0  
00421A00  jmp         __$EncStackInitStart+18Fh (0421A0Bh)  
00421A02  mov         eax,dword ptr [i]  
00421A05  add         eax,1  
00421A08  mov         dword ptr [i],eax  
00421A0B  cmp         dword ptr [i],4  
00421A0F  jge         __$EncStackInitStart+1CEh (0421A4Ah)  
		printf("%d %d\n", ptr[i][0], ptr[i][1]);
00421A11  mov         eax,dword ptr [i]  
00421A14  mov         ecx,dword ptr [ptr]  
00421A17  lea         edx,[ecx+eax*8]  
00421A1A  mov         eax,4  
00421A1F  shl         eax,0  
00421A22  mov         ecx,dword ptr [edx+eax]  
00421A25  push        ecx  
00421A26  mov         edx,dword ptr [i]  
00421A29  mov         eax,dword ptr [ptr]  
00421A2C  lea         ecx,[eax+edx*8]  
00421A2F  mov         edx,4  
00421A34  imul        eax,edx,0  
00421A37  mov         ecx,dword ptr [ecx+eax]  
00421A3A  push        ecx  
00421A3B  push        offset string "%d %d\n" (0427B48h)  
00421A40  call        _printf (04210D2h)  
00421A45  add         esp,0Ch  
00421A48  jmp         __$EncStackInitStart+186h (0421A02h)  

	return 0;
00421A4A  xor         eax,eax  
}
00421A4C  push        edx  
00421A4D  mov         ecx,ebp  
00421A4F  push        eax  
00421A50  lea         edx,ds:[421A7Ch]  
00421A56  call        @_RTC_CheckStackVars@8 (04211EAh)  
00421A5B  pop         eax  
00421A5C  pop         edx  
00421A5D  pop         edi  
00421A5E  pop         esi  
00421A5F  pop         ebx  
00421A60  mov         ecx,dword ptr [ebp-4]  
00421A63  xor         ecx,ebp  
00421A65  call        @__security_check_cookie@4 (042114Fh)  
00421A6A  add         esp,13Ch  
00421A70  cmp         ebp,esp  
00421A72  call        __RTC_CheckEsp (042124Eh)  
00421A77  mov         esp,ebp  
00421A79  pop         ebp  
00421A7A  ret

 


 

* 배열 포인터와 포인터 배열

   int* whoA[4];      // 포인터 배열

   int (*whoA)[4];    // 배열 포인터

 

#include <stdio.h>

int main(void)
{
003F1870  push        ebp  
003F1871  mov         ebp,esp  
003F1873  sub         esp,158h  
003F1879  push        ebx  
003F187A  push        esi  
003F187B  push        edi  
003F187C  lea         edi,[ebp-98h]  
003F1882  mov         ecx,26h  
003F1887  mov         eax,0CCCCCCCCh  
003F188C  rep stos    dword ptr es:[edi]  
003F188E  mov         eax,dword ptr [__security_cookie (03FA000h)]  
003F1893  xor         eax,ebp  
003F1895  mov         dword ptr [ebp-4],eax  
003F1898  mov         ecx,offset _F83B8595_ArrPtrAndPtrArr@c (03FC008h)  
003F189D  call        @__CheckForDebuggerJustMyCode@4 (03F132Ah)  
003F18A2  nop  
	int num1 = 10, num2 = 20, num3 = 30, num4 = 40;
003F18A3  mov         dword ptr [num1],0Ah  
003F18AA  mov         dword ptr [num2],14h  
003F18B1  mov         dword ptr [num3],1Eh  
003F18B8  mov         dword ptr [num4],28h  
	int arr2d[2][4] = { 1,2,3,4,5,6,7,8 };
003F18BF  mov         dword ptr [arr2d],1  
003F18C6  mov         dword ptr [ebp-54h],2  
003F18CD  mov         dword ptr [ebp-50h],3  
003F18D4  mov         dword ptr [ebp-4Ch],4  
003F18DB  mov         dword ptr [ebp-48h],5  
003F18E2  mov         dword ptr [ebp-44h],6  
003F18E9  mov         dword ptr [ebp-40h],7  
003F18F0  mov         dword ptr [ebp-3Ch],8  
	int i, j;

	int* whoA[4] = { &num1, &num2, &num3, &num4 };
003F18F7  lea         eax,[num1]  
003F18FA  mov         dword ptr [whoA],eax  
003F1900  lea         eax,[num2]  
003F1903  mov         dword ptr [ebp-84h],eax  
003F1909  lea         eax,[num3]  
003F190C  mov         dword ptr [ebp-80h],eax  
003F190F  lea         eax,[num4]  
003F1912  mov         dword ptr [ebp-7Ch],eax  
	int (*whoB)[4] = arr2d;
003F1915  lea         eax,[arr2d]  
003F1918  mov         dword ptr [whoB],eax  

	printf("%d %d %d %d\n", *whoA[0], *whoA[1], *whoA[2], *whoA[3]);
003F191E  mov         eax,4  
003F1923  imul        ecx,eax,3  
003F1926  mov         edx,dword ptr whoA[ecx]  
003F192D  mov         eax,dword ptr [edx]  
003F192F  push        eax  
003F1930  mov         ecx,4  
003F1935  shl         ecx,1  
003F1937  mov         edx,dword ptr whoA[ecx]  
003F193E  mov         eax,dword ptr [edx]  
003F1940  push        eax  
003F1941  mov         ecx,4  
003F1946  shl         ecx,0  
003F1949  mov         edx,dword ptr whoA[ecx]  
003F1950  mov         eax,dword ptr [edx]  
003F1952  push        eax  
003F1953  mov         ecx,4  
003F1958  imul        edx,ecx,0  
003F195B  mov         eax,dword ptr whoA[edx]  
003F1962  mov         ecx,dword ptr [eax]  
003F1964  push        ecx  
003F1965  push        offset string "%d %d %d %d\n" (03F7B30h)  
003F196A  call        _printf (03F10D2h)  
003F196F  add         esp,14h  

	for (i = 0; i < 2; i++)
003F1972  mov         dword ptr [i],0  
003F1979  jmp         __$EncStackInitStart+108h (03F1984h)  
003F197B  mov         eax,dword ptr [i]  
003F197E  add         eax,1  
003F1981  mov         dword ptr [i],eax  
003F1984  cmp         dword ptr [i],2  
003F1988  jge         __$EncStackInitStart+157h (03F19D3h)  
	{
		for (j = 0; j < 4; j++)
003F198A  mov         dword ptr [j],0  
003F1991  jmp         __$EncStackInitStart+120h (03F199Ch)  
003F1993  mov         eax,dword ptr [j]  
003F1996  add         eax,1  
003F1999  mov         dword ptr [j],eax  
003F199C  cmp         dword ptr [j],4  
003F19A0  jge         __$EncStackInitStart+148h (03F19C4h)  
			printf("%d ", whoB[i][j]);
003F19A2  mov         eax,dword ptr [i]  
003F19A5  shl         eax,4  
003F19A8  add         eax,dword ptr [whoB]  
003F19AE  mov         ecx,dword ptr [j]  
003F19B1  mov         edx,dword ptr [eax+ecx*4]  
003F19B4  push        edx  
003F19B5  push        offset string "%d " (03F7B40h)  
003F19BA  call        _printf (03F10D2h)  
003F19BF  add         esp,8  
003F19C2  jmp         __$EncStackInitStart+117h (03F1993h)  
		printf("\n");
003F19C4  push        offset string "\n" (03F7B44h)  
003F19C9  call        _printf (03F10D2h)  
003F19CE  add         esp,4  
	}
003F19D1  jmp         __$EncStackInitStart+0FFh (03F197Bh)  

	return 0;
003F19D3  xor         eax,eax  
}
003F19D5  push        edx  
003F19D6  mov         ecx,ebp  
003F19D8  push        eax  
003F19D9  lea         edx,ds:[3F1A04h]  
003F19DF  call        @_RTC_CheckStackVars@8 (03F11EAh)  
003F19E4  pop         eax  
003F19E5  pop         edx  
003F19E6  pop         edi  
003F19E7  pop         esi  
003F19E8  pop         ebx  
003F19E9  mov         ecx,dword ptr [ebp-4]  
003F19EC  xor         ecx,ebp  
003F19EE  call        @__security_check_cookie@4 (03F114Fh)  
003F19F3  add         esp,158h  
003F19F9  cmp         ebp,esp  
003F19FB  call        __RTC_CheckEsp (03F124Eh)  
003F1A00  mov         esp,ebp  
003F1A02  pop         ebp  
003F1A03  ret

 


 

* 2차원 배열에서도 arr[i] == *(arr + i)는 같다

 


int main(void)
{
00251950  push        ebp  
00251951  mov         ebp,esp  
00251953  sub         esp,0FCh  
00251959  push        ebx  
0025195A  push        esi  
0025195B  push        edi  
0025195C  lea         edi,[ebp-3Ch]  
0025195F  mov         ecx,0Fh  
00251964  mov         eax,0CCCCCCCCh  
00251969  rep stos    dword ptr es:[edi]  
0025196B  mov         ecx,offset _A3320C7D_FunctionPointer@c (025C008h)  
00251970  call        @__CheckForDebuggerJustMyCode@4 (0251334h)  
00251975  nop  
	char* str = "Function Pointer";
00251976  mov         dword ptr [str],offset string "Function Pointer" (0257B44h)  
	int num1 = 10, num2 = 20;
0025197D  mov         dword ptr [num1],0Ah  
00251984  mov         dword ptr [num2],14h  

	void (*fptr1)(int, int) = SimpleAdder;
0025198B  mov         dword ptr [fptr1],offset _SimpleAdder (0251244h)  
	void (*fptr2)(char*) = ShowString;
00251992  mov         dword ptr [fptr2],offset _ShowString (025122Bh)  

	// 함수 포인터 변수에 의한 호출
	fptr1(num1, num2);
00251999  mov         esi,esp  
0025199B  mov         eax,dword ptr [num2]  
0025199E  push        eax  
0025199F  mov         ecx,dword ptr [num1]  
002519A2  push        ecx  
002519A3  call        dword ptr [fptr1]  
002519A6  add         esp,8  
002519A9  cmp         esi,esp  
002519AB  call        __RTC_CheckEsp (0251258h)  
002519B0  nop  
	fptr2(str);
002519B1  mov         esi,esp  
002519B3  mov         eax,dword ptr [str]  
002519B6  push        eax  
002519B7  call        dword ptr [fptr2]  
002519BA  add         esp,4  
002519BD  cmp         esi,esp  
002519BF  call        __RTC_CheckEsp (0251258h)  
002519C4  nop  

	return 0;
002519C5  xor         eax,eax  
}
002519C7  pop         edi  
002519C8  pop         esi  
002519C9  pop         ebx  
002519CA  add         esp,0FCh  
002519D0  cmp         ebp,esp  
002519D2  call        __RTC_CheckEsp (0251258h)  
002519D7  mov         esp,ebp  
002519D9  pop         ebp  
002519DA  ret

 

int main(void)
{
00007FF77EA21960  push        rbp  
00007FF77EA21962  push        rdi  
00007FF77EA21963  sub         rsp,188h  
00007FF77EA2196A  lea         rbp,[rsp+20h]  
00007FF77EA2196F  lea         rcx,[__A3320C7D_FunctionPointer@c (07FF77EA32008h)]  
00007FF77EA21976  call        __CheckForDebuggerJustMyCode (07FF77EA21375h)  
00007FF77EA2197B  nop  
	char* str = "Function Pointer";
00007FF77EA2197C  lea         rax,[string "Function Pointer" (07FF77EA2AC40h)]  
00007FF77EA21983  mov         qword ptr [str],rax  
	int num1 = 10, num2 = 20;
00007FF77EA21987  mov         dword ptr [num1],0Ah  
00007FF77EA2198E  mov         dword ptr [num2],14h  

	void (*fptr1)(int, int) = SimpleAdder;
00007FF77EA21995  lea         rax,[SimpleAdder (07FF77EA21253h)]  
00007FF77EA2199C  mov         qword ptr [fptr1],rax  
	void (*fptr2)(char*) = ShowString;
00007FF77EA219A0  lea         rax,[ShowString (07FF77EA2106Eh)]  
00007FF77EA219A7  mov         qword ptr [fptr2],rax  

	// 함수 포인터 변수에 의한 호출
	fptr1(num1, num2);
00007FF77EA219AE  mov         edx,dword ptr [num2]  
00007FF77EA219B1  mov         ecx,dword ptr [num1]  
00007FF77EA219B4  call        qword ptr [fptr1]  
00007FF77EA219B7  nop  
	fptr2(str);
00007FF77EA219B8  mov         rcx,qword ptr [str]  
00007FF77EA219BC  call        qword ptr [fptr2]  
00007FF77EA219C2  nop  

	return 0;
00007FF77EA219C3  xor         eax,eax  
}
00007FF77EA219C5  lea         rsp,[rbp+168h]  
00007FF77EA219CC  pop         rdi  
00007FF77EA219CD  pop         rbp  
00007FF77EA219CE  ret

 


 

int main(void)
{
00ED19D0  push        ebp  
00ED19D1  mov         ebp,esp  
00ED19D3  sub         esp,0E4h  
00ED19D9  push        ebx  
00ED19DA  push        esi  
00ED19DB  push        edi  
00ED19DC  lea         edi,[ebp-24h]  
00ED19DF  mov         ecx,9  
00ED19E4  mov         eax,0CCCCCCCCh  
00ED19E9  rep stos    dword ptr es:[edi]  
00ED19EB  mov         ecx,offset _EDD9FEEB_UsefulFunctionPointer@c (0EDC008h)  
00ED19F0  call        @__CheckForDebuggerJustMyCode@4 (0ED1339h)  
00ED19F5  nop  
	int age1 = 20;
00ED19F6  mov         dword ptr [age1],14h  
	int age2 = 30;
00ED19FD  mov         dword ptr [age2],1Eh  
	int first;

	printf("입장순서1\n");
00ED1A04  push        offset string "\xc0\xd4\xc0\xe5\xbc\xf8\xbc\xad1\n" (0ED7B30h)  
00ED1A09  call        _printf (0ED10DCh)  
00ED1A0E  add         esp,4  
	first = WhoIsFirst(age1, age2, OlderFirst);
00ED1A11  push        offset _OlderFirst (0ED10B9h)  
00ED1A16  mov         eax,dword ptr [age2]  
00ED1A19  push        eax  
00ED1A1A  mov         ecx,dword ptr [age1]  
00ED1A1D  push        ecx  
00ED1A1E  call        _WhoIsFirst (0ED1073h)  
00ED1A23  add         esp,0Ch  
00ED1A26  mov         dword ptr [first],eax  
	printf("%d세와 %d세 중 %d세가 먼저 입장!\n\n", age1, age2, first);
00ED1A29  mov         eax,dword ptr [first]  
00ED1A2C  push        eax  
00ED1A2D  mov         ecx,dword ptr [age2]  
00ED1A30  push        ecx  
00ED1A31  mov         edx,dword ptr [age1]  
00ED1A34  push        edx  
00ED1A35  push        offset string "%d\xbc\xbc\xbf\xcd %d\xbc\xbc \xc1\xdf %d\xbc\xbc\xb0\xa1 \xb8\xd5\xc0\xfa \xc0\xd4\xc0\xe5@"... (0ED7B40h)  
00ED1A3A  call        _printf (0ED10DCh)  
00ED1A3F  add         esp,10h  

	printf("입장순서2\n");
00ED1A42  push        offset string "\xc0\xd4\xc0\xe5\xbc\xf8\xbc\xad2\n" (0ED7B6Ch)  
00ED1A47  call        _printf (0ED10DCh)  
00ED1A4C  add         esp,4  
	first = WhoIsFirst(age1, age2, YoungFirst);
00ED1A4F  push        offset _YoungFirst (0ED110Eh)  
00ED1A54  mov         eax,dword ptr [age2]  
00ED1A57  push        eax  
00ED1A58  mov         ecx,dword ptr [age1]  
00ED1A5B  push        ecx  
00ED1A5C  call        _WhoIsFirst (0ED1073h)  
00ED1A61  add         esp,0Ch  
00ED1A64  mov         dword ptr [first],eax  
	printf("%d세와 %d세 중 %d세가 먼저 입장!\n\n", age1, age2, first);
00ED1A67  mov         eax,dword ptr [first]  
00ED1A6A  push        eax  
00ED1A6B  mov         ecx,dword ptr [age2]  
00ED1A6E  push        ecx  
00ED1A6F  mov         edx,dword ptr [age1]  
00ED1A72  push        edx  
00ED1A73  push        offset string "%d\xbc\xbc\xbf\xcd %d\xbc\xbc \xc1\xdf %d\xbc\xbc\xb0\xa1 \xb8\xd5\xc0\xfa \xc0\xd4\xc0\xe5@"... (0ED7B40h)  
00ED1A78  call        _printf (0ED10DCh)  
00ED1A7D  add         esp,10h  

	return 0;
00ED1A80  xor         eax,eax  
}
00ED1A82  pop         edi  
00ED1A83  pop         esi  
00ED1A84  pop         ebx  
00ED1A85  add         esp,0E4h  
00ED1A8B  cmp         ebp,esp  
00ED1A8D  call        __RTC_CheckEsp (0ED125Dh)  
00ED1A92  mov         esp,ebp  
00ED1A94  pop         ebp  
00ED1A95  ret

 

int main(void)
{
00007FF6B1F11A10  push        rbp  
00007FF6B1F11A12  push        rdi  
00007FF6B1F11A13  sub         rsp,148h  
00007FF6B1F11A1A  lea         rbp,[rsp+20h]  
00007FF6B1F11A1F  lea         rcx,[__EDD9FEEB_UsefulFunctionPointer@c (07FF6B1F22008h)]  
00007FF6B1F11A26  call        __CheckForDebuggerJustMyCode (07FF6B1F1137Ah)  
00007FF6B1F11A2B  nop  
	int age1 = 20;
00007FF6B1F11A2C  mov         dword ptr [age1],14h  
	int age2 = 30;
00007FF6B1F11A33  mov         dword ptr [age2],1Eh  
	int first;

	printf("입장순서1\n");
00007FF6B1F11A3A  lea         rcx,[string "\xc0\xd4\xc0\xe5\xbc\xf8\xbc\xad1\n" (07FF6B1F1AC28h)]  
00007FF6B1F11A41  call        printf (07FF6B1F111A4h)  
00007FF6B1F11A46  nop  
	first = WhoIsFirst(age1, age2, OlderFirst);
00007FF6B1F11A47  lea         r8,[OlderFirst (07FF6B1F11078h)]  
00007FF6B1F11A4E  mov         edx,dword ptr [age2]  
00007FF6B1F11A51  mov         ecx,dword ptr [age1]  
00007FF6B1F11A54  call        WhoIsFirst (07FF6B1F1111Dh)  
00007FF6B1F11A59  mov         dword ptr [first],eax  
	printf("%d세와 %d세 중 %d세가 먼저 입장!\n\n", age1, age2, first);
00007FF6B1F11A5C  mov         r9d,dword ptr [first]  
00007FF6B1F11A60  mov         r8d,dword ptr [age2]  
00007FF6B1F11A64  mov         edx,dword ptr [age1]  
00007FF6B1F11A67  lea         rcx,[string "%d\xbc\xbc\xbf\xcd %d\xbc\xbc \xc1\xdf %d\xbc\xbc\xb0\xa1 \xb8\xd5\xc0\xfa \xc0\xd4\xc0\xe5@"... (07FF6B1F1AC38h)]  
00007FF6B1F11A6E  call        printf (07FF6B1F111A4h)  
00007FF6B1F11A73  nop  

	printf("입장순서2\n");
00007FF6B1F11A74  lea         rcx,[string "\xc0\xd4\xc0\xe5\xbc\xf8\xbc\xad2\n" (07FF6B1F1AC68h)]  
00007FF6B1F11A7B  call        printf (07FF6B1F111A4h)  
00007FF6B1F11A80  nop  
	first = WhoIsFirst(age1, age2, YoungFirst);
00007FF6B1F11A81  lea         r8,[YoungFirst (07FF6B1F11109h)]  
00007FF6B1F11A88  mov         edx,dword ptr [age2]  
00007FF6B1F11A8B  mov         ecx,dword ptr [age1]  
00007FF6B1F11A8E  call        WhoIsFirst (07FF6B1F1111Dh)  
00007FF6B1F11A93  mov         dword ptr [first],eax  
	printf("%d세와 %d세 중 %d세가 먼저 입장!\n\n", age1, age2, first);
00007FF6B1F11A96  mov         r9d,dword ptr [first]  
00007FF6B1F11A9A  mov         r8d,dword ptr [age2]  
00007FF6B1F11A9E  mov         edx,dword ptr [age1]  
00007FF6B1F11AA1  lea         rcx,[string "%d\xbc\xbc\xbf\xcd %d\xbc\xbc \xc1\xdf %d\xbc\xbc\xb0\xa1 \xb8\xd5\xc0\xfa \xc0\xd4\xc0\xe5@"... (07FF6B1F1AC38h)]  
00007FF6B1F11AA8  call        printf (07FF6B1F111A4h)  
00007FF6B1F11AAD  nop  

	return 0;
00007FF6B1F11AAE  xor         eax,eax  
}
00007FF6B1F11AB0  lea         rsp,[rbp+128h]  
00007FF6B1F11AB7  pop         rdi  
00007FF6B1F11AB8  pop         rbp  
00007FF6B1F11AB9  ret