IT공부/IT서적

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

shine94 2025. 2. 9. 22:31
#include <stdio.h>

struct point
{
	int xpos;
	int ypos;
};
struct person
{
	char name[20];
	char phoneNum[20];
	int age;
};

int main(void)
{
000F1870  push        ebp  
000F1871  mov         ebp,esp  
000F1873  sub         esp,108h  
000F1879  push        ebx  
000F187A  push        esi  
000F187B  push        edi  
000F187C  lea         edi,[ebp-48h]  
000F187F  mov         ecx,12h  
000F1884  mov         eax,0CCCCCCCCh  
000F1889  rep stos    dword ptr es:[edi]  
000F188B  mov         eax,dword ptr [__security_cookie (0FA000h)]  
000F1890  xor         eax,ebp  
000F1892  mov         dword ptr [ebp-4],eax  
000F1895  mov         ecx,offset _2B3E10B1_InitStructVal@c (0FC008h)  
000F189A  call        @__CheckForDebuggerJustMyCode@4 (0F132Ah)  
000F189F  nop  
	struct point pos = { 10,20 };
000F18A0  mov         dword ptr [pos],0Ah  
000F18A7  mov         dword ptr [ebp-0Ch],14h  
	struct person man = { "이승기", "010-1111-1111", 21 };
000F18AE  mov         eax,dword ptr [string "\xc0\xcc\xbd\xc2\xb1\xe2" (0F7B30h)]  
000F18B3  mov         dword ptr [man],eax  
000F18B6  mov         cx,word ptr ds:[0F7B34h]  
000F18BD  mov         word ptr [ebp-40h],cx  
000F18C1  mov         dl,byte ptr ds:[0F7B36h]  
000F18C7  mov         byte ptr [ebp-3Eh],dl  
000F18CA  xor         eax,eax  
000F18CC  mov         dword ptr [ebp-3Dh],eax  
000F18CF  mov         dword ptr [ebp-39h],eax  
000F18D2  mov         dword ptr [ebp-35h],eax  
000F18D5  mov         byte ptr [ebp-31h],al  
000F18D8  mov         eax,dword ptr [string "010-1111-1111" (0F7B38h)]  
000F18DD  mov         dword ptr [ebp-30h],eax  
000F18E0  mov         ecx,dword ptr ds:[0F7B3Ch]  
000F18E6  mov         dword ptr [ebp-2Ch],ecx  
000F18E9  mov         edx,dword ptr ds:[0F7B40h]  
000F18EF  mov         dword ptr [ebp-28h],edx  
000F18F2  mov         ax,word ptr ds:[000F7B44h]  
000F18F8  mov         word ptr [ebp-24h],ax  
000F18FC  xor         eax,eax  
000F18FE  mov         dword ptr [ebp-22h],eax  
000F1901  mov         word ptr [ebp-1Eh],ax  
000F1905  mov         dword ptr [ebp-1Ch],15h  

	printf("%d %d\n", pos.xpos, pos.ypos);
000F190C  mov         eax,dword ptr [ebp-0Ch]  
000F190F  push        eax  
000F1910  mov         ecx,dword ptr [pos]  
000F1913  push        ecx  
000F1914  push        offset string "%d %d\n" (0F7B48h)  
000F1919  call        _printf (0F10D2h)  
000F191E  add         esp,0Ch  
	printf("%s %s %d\n", man.name, man.phoneNum, man.age);
000F1921  mov         eax,dword ptr [ebp-1Ch]  
000F1924  push        eax  
000F1925  lea         ecx,[ebp-30h]  
000F1928  push        ecx  
000F1929  lea         edx,[man]  
000F192C  push        edx  
000F192D  push        offset string "%s %s %d\n" (0F7B50h)  
000F1932  call        _printf (0F10D2h)  
000F1937  add         esp,10h  

	return 0;
000F193A  xor         eax,eax  
}
000F193C  push        edx  
000F193D  mov         ecx,ebp  
000F193F  push        eax  
000F1940  lea         edx,ds:[0F196Ch]  
000F1946  call        @_RTC_CheckStackVars@8 (0F11EAh)  
000F194B  pop         eax  
000F194C  pop         edx  
000F194D  pop         edi  
000F194E  pop         esi  
000F194F  pop         ebx  
000F1950  mov         ecx,dword ptr [ebp-4]  
000F1953  xor         ecx,ebp  
000F1955  call        @__security_check_cookie@4 (0F114Fh)  
000F195A  add         esp,108h  
000F1960  cmp         ebp,esp  
000F1962  call        __RTC_CheckEsp (0F124Eh)  
000F1967  mov         esp,ebp  
000F1969  pop         ebp  
000F196A  ret

 

#include <stdio.h>

struct point
{
	int xpos;
	int ypos;
};
struct person
{
	char name[20];
	char phoneNum[20];
	int age;
};

int main(void)
{
00007FF78C1C1890  push        rbp  
00007FF78C1C1892  push        rsi  
00007FF78C1C1893  push        rdi  
00007FF78C1C1894  sub         rsp,150h  
00007FF78C1C189B  lea         rbp,[rsp+20h]  
00007FF78C1C18A0  lea         rdi,[rsp+20h]  
00007FF78C1C18A5  mov         ecx,1Ch  
00007FF78C1C18AA  mov         eax,0CCCCCCCCh  
00007FF78C1C18AF  rep stos    dword ptr [rdi]  
00007FF78C1C18B1  mov         rax,qword ptr [__security_cookie (07FF78C1CD000h)]  
00007FF78C1C18B8  xor         rax,rbp  
00007FF78C1C18BB  mov         qword ptr [rbp+128h],rax  
00007FF78C1C18C2  lea         rcx,[__2B3E10B1_InitStructVal@c (07FF78C1D2008h)]  
00007FF78C1C18C9  call        __CheckForDebuggerJustMyCode (07FF78C1C136Bh)  
00007FF78C1C18CE  nop  
	struct point pos = { 10,20 };
00007FF78C1C18CF  mov         dword ptr [pos],0Ah  
00007FF78C1C18D6  mov         dword ptr [rbp+0Ch],14h  
	struct person man = { "이승기", "010-1111-1111", 21 };
00007FF78C1C18DD  lea         rax,[man]  
00007FF78C1C18E1  lea         rcx,[string "\xc0\xcc\xbd\xc2\xb1\xe2" (07FF78C1CACF0h)]  
00007FF78C1C18E8  mov         rdi,rax  
00007FF78C1C18EB  mov         rsi,rcx  
00007FF78C1C18EE  mov         ecx,7  
00007FF78C1C18F3  rep movs    byte ptr [rdi],byte ptr [rsi]  
00007FF78C1C18F5  lea         rax,[rbp+2Fh]  
00007FF78C1C18F9  mov         rdi,rax  
00007FF78C1C18FC  xor         eax,eax  
00007FF78C1C18FE  mov         ecx,0Dh  
00007FF78C1C1903  rep stos    byte ptr [rdi]  
00007FF78C1C1905  lea         rax,[rbp+3Ch]  
00007FF78C1C1909  lea         rcx,[string "010-1111-1111" (07FF78C1CACF8h)]  
00007FF78C1C1910  mov         rdi,rax  
00007FF78C1C1913  mov         rsi,rcx  
00007FF78C1C1916  mov         ecx,0Eh  
00007FF78C1C191B  rep movs    byte ptr [rdi],byte ptr [rsi]  
00007FF78C1C191D  lea         rax,[rbp+4Ah]  
00007FF78C1C1921  mov         rdi,rax  
00007FF78C1C1924  xor         eax,eax  
00007FF78C1C1926  mov         ecx,6  
00007FF78C1C192B  rep stos    byte ptr [rdi]  
00007FF78C1C192D  mov         dword ptr [rbp+50h],15h  

	printf("%d %d\n", pos.xpos, pos.ypos);
00007FF78C1C1934  mov         r8d,dword ptr [rbp+0Ch]  
00007FF78C1C1938  mov         edx,dword ptr [pos]  
00007FF78C1C193B  lea         rcx,[string "%d %d\n" (07FF78C1CAD08h)]  
00007FF78C1C1942  call        printf (07FF78C1C1195h)  
00007FF78C1C1947  nop  
	printf("%s %s %d\n", man.name, man.phoneNum, man.age);
00007FF78C1C1948  mov         r9d,dword ptr [rbp+50h]  
00007FF78C1C194C  lea         r8,[rbp+3Ch]  
00007FF78C1C1950  lea         rdx,[man]  
00007FF78C1C1954  lea         rcx,[string "%s %s %d\n" (07FF78C1CAD10h)]  
00007FF78C1C195B  call        printf (07FF78C1C1195h)  
00007FF78C1C1960  nop  

	return 0;
00007FF78C1C1961  xor         eax,eax  
}
00007FF78C1C1963  mov         edi,eax  
00007FF78C1C1965  lea         rcx,[rbp-20h]  
00007FF78C1C1969  lea         rdx,[__xt_z+220h (07FF78C1CACC0h)]  
00007FF78C1C1970  call        _RTC_CheckStackVars (07FF78C1C1307h)  
00007FF78C1C1975  mov         eax,edi  
00007FF78C1C1977  mov         rcx,qword ptr [rbp+128h]  
00007FF78C1C197E  xor         rcx,rbp  
00007FF78C1C1981  call        __security_check_cookie (07FF78C1C11AEh)  
00007FF78C1C1986  lea         rsp,[rbp+130h]  
00007FF78C1C198D  pop         rdi  
00007FF78C1C198E  pop         rsi  
00007FF78C1C198F  pop         rbp  
00007FF78C1C1990  ret

 


 

#include <stdio.h>

struct point
{
	int xpos;
	int ypos;
};

int main(void)
{
005E1960  push        ebp  
005E1961  mov         ebp,esp  
005E1963  sub         esp,0F0h  
005E1969  push        ebx  
005E196A  push        esi  
005E196B  push        edi  
005E196C  lea         edi,[ebp-30h]  
005E196F  mov         ecx,0Ch  
005E1974  mov         eax,0CCCCCCCCh  
005E1979  rep stos    dword ptr es:[edi]  
005E197B  mov         eax,dword ptr [__security_cookie (05EA000h)]  
005E1980  xor         eax,ebp  
005E1982  mov         dword ptr [ebp-4],eax  
005E1985  mov         ecx,offset _613FC159_StructArray@c (05EC008h)  
005E198A  call        @__CheckForDebuggerJustMyCode@4 (05E1339h)  
005E198F  nop  
	struct point arr[3];
	int i;

	for (i = 0; i < 3; i++)
005E1990  mov         dword ptr [i],0  
005E1997  jmp         __$EncStackInitStart+36h (05E19A2h)  
005E1999  mov         eax,dword ptr [i]  
005E199C  add         eax,1  
005E199F  mov         dword ptr [i],eax  
005E19A2  cmp         dword ptr [i],3  
005E19A6  jge         __$EncStackInitStart+68h (05E19D4h)  
	{
		printf("점의 좌표 입력 : ");
005E19A8  push        offset string "\xc1\xa1\xc0\xc7 \xc1\xc2\xc7\xa5 \xc0\xd4\xb7\xc2 : " (05E7B30h)  
005E19AD  call        _printf (05E10DCh)  
005E19B2  add         esp,4  
		scanf_s("%d %d", &arr[i].xpos, &arr[i].ypos);
005E19B5  mov         eax,dword ptr [i]  
005E19B8  lea         ecx,[ebp+eax*8-1Ch]  
005E19BC  push        ecx  
005E19BD  mov         edx,dword ptr [i]  
005E19C0  lea         eax,arr[edx*8]  
005E19C4  push        eax  
005E19C5  push        offset string "%d %d" (05E7B48h)  
005E19CA  call        _scanf_s (05E1294h)  
005E19CF  add         esp,0Ch  
	}
005E19D2  jmp         __$EncStackInitStart+2Dh (05E1999h)  

	for (i = 0; i < 3; i++)
005E19D4  mov         dword ptr [i],0  
005E19DB  jmp         __$EncStackInitStart+7Ah (05E19E6h)  
005E19DD  mov         eax,dword ptr [i]  
005E19E0  add         eax,1  
005E19E3  mov         dword ptr [i],eax  
005E19E6  cmp         dword ptr [i],3  
005E19EA  jge         __$EncStackInitStart+9Fh (05E1A0Bh)  
	{
		printf("[%d, %d]", arr[i].xpos, arr[i].ypos);
005E19EC  mov         eax,dword ptr [i]  
005E19EF  mov         ecx,dword ptr [ebp+eax*8-1Ch]  
005E19F3  push        ecx  
005E19F4  mov         edx,dword ptr [i]  
005E19F7  mov         eax,dword ptr arr[edx*8]  
005E19FB  push        eax  
005E19FC  push        offset string "[%d, %d]" (05E7B50h)  
005E1A01  call        _printf (05E10DCh)  
005E1A06  add         esp,0Ch  
	}
005E1A09  jmp         __$EncStackInitStart+71h (05E19DDh)  

	return 0;
005E1A0B  xor         eax,eax  
}
005E1A0D  push        edx  
005E1A0E  mov         ecx,ebp  
005E1A10  push        eax  
005E1A11  lea         edx,ds:[5E1A3Ch]  
005E1A17  call        @_RTC_CheckStackVars@8 (05E11F4h)  
005E1A1C  pop         eax  
005E1A1D  pop         edx  
005E1A1E  pop         edi  
005E1A1F  pop         esi  
005E1A20  pop         ebx  
005E1A21  mov         ecx,dword ptr [ebp-4]  
005E1A24  xor         ecx,ebp  
005E1A26  call        @__security_check_cookie@4 (05E1159h)  
005E1A2B  add         esp,0F0h  
005E1A31  cmp         ebp,esp  
005E1A33  call        __RTC_CheckEsp (05E1258h)  
005E1A38  mov         esp,ebp  
005E1A3A  pop         ebp  
005E1A3B  ret

 

#include <stdio.h>

struct point
{
	int xpos;
	int ypos;
};

int main(void)
{
00F41960  push        ebp  
00F41961  mov         ebp,esp  
00F41963  sub         esp,0FCh  
00F41969  push        ebx  
00F4196A  push        esi  
00F4196B  push        edi  
00F4196C  lea         edi,[ebp-3Ch]  
00F4196F  mov         ecx,0Fh  
00F41974  mov         eax,0CCCCCCCCh  
00F41979  rep stos    dword ptr es:[edi]  
00F4197B  mov         eax,dword ptr [__security_cookie (0F4A000h)]  
00F41980  xor         eax,ebp  
00F41982  mov         dword ptr [ebp-4],eax  
00F41985  mov         ecx,offset _613FC159_StructArray@c (0F4C008h)  
00F4198A  call        @__CheckForDebuggerJustMyCode@4 (0F41339h)  
00F4198F  nop  
	struct point arr[3];
	//int i;

	for (int i = 0; i < 3; i++)
00F41990  mov         dword ptr [ebp-2Ch],0  
00F41997  jmp         __$EncStackInitStart+36h (0F419A2h)  
00F41999  mov         eax,dword ptr [ebp-2Ch]  
00F4199C  add         eax,1  
00F4199F  mov         dword ptr [ebp-2Ch],eax  
00F419A2  cmp         dword ptr [ebp-2Ch],3  
00F419A6  jge         __$EncStackInitStart+68h (0F419D4h)  
	{
		printf("점의 좌표 입력 : ");
00F419A8  push        offset string "\xc1\xa1\xc0\xc7 \xc1\xc2\xc7\xa5 \xc0\xd4\xb7\xc2 : " (0F47B30h)  
00F419AD  call        _printf (0F410DCh)  
00F419B2  add         esp,4  
		scanf_s("%d %d", &arr[i].xpos, &arr[i].ypos);
00F419B5  mov         eax,dword ptr [ebp-2Ch]  
00F419B8  lea         ecx,[ebp+eax*8-1Ch]  
00F419BC  push        ecx  
00F419BD  mov         edx,dword ptr [ebp-2Ch]  
00F419C0  lea         eax,arr[edx*8]  
00F419C4  push        eax  
00F419C5  push        offset string "%d %d" (0F47B48h)  
00F419CA  call        _scanf_s (0F41294h)  
00F419CF  add         esp,0Ch  
	}
00F419D2  jmp         __$EncStackInitStart+2Dh (0F41999h)  

	for (int i = 0; i < 3; i++)
00F419D4  mov         dword ptr [ebp-38h],0  
00F419DB  jmp         __$EncStackInitStart+7Ah (0F419E6h)  
00F419DD  mov         eax,dword ptr [ebp-38h]  
00F419E0  add         eax,1  
00F419E3  mov         dword ptr [ebp-38h],eax  
00F419E6  cmp         dword ptr [ebp-38h],3  
00F419EA  jge         __$EncStackInitStart+9Fh (0F41A0Bh)  
	{
		printf("[%d, %d]", arr[i].xpos, arr[i].ypos);
00F419EC  mov         eax,dword ptr [ebp-38h]  
00F419EF  mov         ecx,dword ptr [ebp+eax*8-1Ch]  
00F419F3  push        ecx  
00F419F4  mov         edx,dword ptr [ebp-38h]  
00F419F7  mov         eax,dword ptr arr[edx*8]  
00F419FB  push        eax  
00F419FC  push        offset string "[%d, %d]" (0F47B50h)  
00F41A01  call        _printf (0F410DCh)  
00F41A06  add         esp,0Ch  
	}
00F41A09  jmp         __$EncStackInitStart+71h (0F419DDh)  

	return 0;
00F41A0B  xor         eax,eax  
}
00F41A0D  push        edx  
00F41A0E  mov         ecx,ebp  
00F41A10  push        eax  
00F41A11  lea         edx,ds:[0F41A3Ch]  
00F41A17  call        @_RTC_CheckStackVars@8 (0F411F4h)  
00F41A1C  pop         eax  
00F41A1D  pop         edx  
00F41A1E  pop         edi  
00F41A1F  pop         esi  
00F41A20  pop         ebx  
00F41A21  mov         ecx,dword ptr [ebp-4]  
00F41A24  xor         ecx,ebp  
00F41A26  call        @__security_check_cookie@4 (0F41159h)  
00F41A2B  add         esp,0FCh  
00F41A31  cmp         ebp,esp  
00F41A33  call        __RTC_CheckEsp (0F41258h)  
00F41A38  mov         esp,ebp  
00F41A3A  pop         ebp  
00F41A3B  ret

 

* for문을 돌릴 때, 가장 상단에 변수 i 선언 vs for 문 돌 때마다 선언

1) 가장 상단에 선언

   [예] int i; → for (i = 0; i < 3; i++)

005E196F  mov         ecx,0Ch

 

2) for 문 돌릴때 마다 선언

   [예] for (int i = 0; i < 3; i++)

00F4196F  mov         ecx,0Fh

 

* 결론

 

#include <stdio.h>

struct point
{
	int xpos;
	int ypos;
};

int main(void)
{
002410A0  push        ebp  
002410A1  mov         ebp,esp  
002410A3  and         esp,0FFFFFFF8h  
002410A6  sub         esp,20h  
002410A9  mov         eax,dword ptr [__security_cookie (0243000h)]  
002410AE  xor         eax,esp  
002410B0  mov         dword ptr [esp+1Ch],eax  
002410B4  push        esi  
002410B5  push        edi  
	struct point arr[3];
	//int i;

	for (int i = 0; i < 3; i++)
002410B6  lea         esi,[esp+0Ch]  
002410BA  mov         edi,3  
002410BF  nop  
	{
		printf("점의 좌표 입력 : ");
002410C0  push        offset string "\xc1\xa1\xc0\xc7 \xc1\xc2\xc7\xa5 \xc0\xd4\xb7\xc2 : " (0242108h)  
002410C5  call        printf (0241020h)  
002410CA  add         esp,4  
		scanf_s("%d %d", &arr[i].xpos, &arr[i].ypos);
002410CD  lea         eax,[esi+4]  
002410D0  push        eax  
002410D1  push        esi  
002410D2  push        offset string "%d %d" (024211Ch)  
002410D7  call        scanf_s (0241060h)  
002410DC  add         esp,0Ch  
002410DF  add         esi,8  
002410E2  sub         edi,1  
002410E5  jne         main+20h (02410C0h)  
	}

	for (int i = 0; i < 3; i++)
002410E7  xor         esi,esi  
002410E9  nop         dword ptr [eax]  
	{
		printf("[%d, %d]", arr[i].xpos, arr[i].ypos);
002410F0  push        dword ptr [esp+esi*8+10h]  
002410F4  push        dword ptr [esp+esi*8+10h]  
002410F8  push        offset string "[%d, %d]" (0242124h)  
002410FD  call        printf (0241020h)  
00241102  inc         esi  
00241103  add         esp,0Ch  
00241106  cmp         esi,3  
00241109  jl          main+50h (02410F0h)  
	}

	return 0;
}
0024110B  mov         ecx,dword ptr [esp+24h]  
0024110F  xor         eax,eax  
00241111  pop         edi  
00241112  pop         esi  
00241113  xor         ecx,esp  
00241115  call        __security_check_cookie (024111Eh)  
0024111A  mov         esp,ebp  
0024111C  pop         ebp  
0024111D  ret

 


 

#include <stdio.h>

struct person
{
	char name[20];
	char phoneNum[20];
	int age;
};

int main(void)
{
00071870  push        ebp  
00071871  mov         ebp,esp  
00071873  sub         esp,15Ch  
00071879  push        ebx  
0007187A  push        esi  
0007187B  push        edi  
0007187C  lea         edi,[ebp-9Ch]  
00071882  mov         ecx,27h  
00071887  mov         eax,0CCCCCCCCh  
0007188C  rep stos    dword ptr es:[edi]  
0007188E  mov         eax,dword ptr [__security_cookie (07A000h)]  
00071893  xor         eax,ebp  
00071895  mov         dword ptr [ebp-4],eax  
00071898  mov         ecx,offset _15F80836_InitStructArray@c (07C008h)  
0007189D  call        @__CheckForDebuggerJustMyCode@4 (07132Ah)  
000718A2  nop  
	struct person arr[3] = {
000718A3  mov         eax,dword ptr [string "\xc0\xcc\xbd\xc2\xb1\xe2" (077B30h)]  
000718A8  mov         dword ptr [arr],eax  
000718AE  mov         cx,word ptr ds:[77B34h]  
000718B5  mov         word ptr [ebp-88h],cx  
000718BC  mov         dl,byte ptr ds:[77B36h]  
000718C2  mov         byte ptr [ebp-86h],dl  
000718C8  xor         eax,eax  
000718CA  mov         dword ptr [ebp-85h],eax  
000718D0  mov         dword ptr [ebp-81h],eax  
000718D6  mov         dword ptr [ebp-7Dh],eax  
000718D9  mov         byte ptr [ebp-79h],al  
000718DC  mov         eax,dword ptr [string "010-1111-1111" (077B38h)]  
000718E1  mov         dword ptr [ebp-78h],eax  
000718E4  mov         ecx,dword ptr ds:[77B3Ch]  
000718EA  mov         dword ptr [ebp-74h],ecx  
000718ED  mov         edx,dword ptr ds:[77B40h]  
000718F3  mov         dword ptr [ebp-70h],edx  
000718F6  mov         ax,word ptr ds:[00077B44h]  
000718FC  mov         word ptr [ebp-6Ch],ax  
00071900  xor         eax,eax  
00071902  mov         dword ptr [ebp-6Ah],eax  
00071905  mov         word ptr [ebp-66h],ax  
00071909  mov         dword ptr [ebp-64h],15h  
00071910  mov         eax,dword ptr [string "\xc1\xa4\xc1\xf6\xbf\xb5" (077B48h)]  
00071915  mov         dword ptr [ebp-60h],eax  
00071918  mov         cx,word ptr ds:[77B4Ch]  
0007191F  mov         word ptr [ebp-5Ch],cx  
00071923  mov         dl,byte ptr ds:[77B4Eh]  
00071929  mov         byte ptr [ebp-5Ah],dl  
0007192C  xor         eax,eax  
0007192E  mov         dword ptr [ebp-59h],eax  
00071931  mov         dword ptr [ebp-55h],eax  
00071934  mov         dword ptr [ebp-51h],eax  
00071937  mov         byte ptr [ebp-4Dh],al  
0007193A  mov         eax,dword ptr [string "010-2222-2222" (077B50h)]  
0007193F  mov         dword ptr [ebp-4Ch],eax  
00071942  mov         ecx,dword ptr ds:[77B54h]  
00071948  mov         dword ptr [ebp-48h],ecx  
0007194B  mov         edx,dword ptr ds:[77B58h]  
00071951  mov         dword ptr [ebp-44h],edx  
00071954  mov         ax,word ptr ds:[00077B5Ch]  
0007195A  mov         word ptr [ebp-40h],ax  
0007195E  xor         eax,eax  
00071960  mov         dword ptr [ebp-3Eh],eax  
00071963  mov         word ptr [ebp-3Ah],ax  
00071967  mov         dword ptr [ebp-38h],16h  
0007196E  mov         eax,dword ptr [string "\xc7\xd1\xc1\xf6\xbc\xf6" (077B60h)]  
00071973  mov         dword ptr [ebp-34h],eax  
00071976  mov         cx,word ptr ds:[77B64h]  
0007197D  mov         word ptr [ebp-30h],cx  
00071981  mov         dl,byte ptr ds:[77B66h]  
00071987  mov         byte ptr [ebp-2Eh],dl  
0007198A  xor         eax,eax  
0007198C  mov         dword ptr [ebp-2Dh],eax  
0007198F  mov         dword ptr [ebp-29h],eax  
00071992  mov         dword ptr [ebp-25h],eax  
00071995  mov         byte ptr [ebp-21h],al  
00071998  mov         eax,dword ptr [string "010-3333-3333" (077B68h)]  
0007199D  mov         dword ptr [ebp-20h],eax  
000719A0  mov         ecx,dword ptr ds:[77B6Ch]  
000719A6  mov         dword ptr [ebp-1Ch],ecx  
000719A9  mov         edx,dword ptr ds:[77B70h]  
000719AF  mov         dword ptr [ebp-18h],edx  
000719B2  mov         ax,word ptr ds:[00077B74h]  
000719B8  mov         word ptr [ebp-14h],ax  
000719BC  xor         eax,eax  
000719BE  mov         dword ptr [ebp-12h],eax  
000719C1  mov         word ptr [ebp-0Eh],ax  
000719C5  mov         dword ptr [ebp-0Ch],17h  
		{"이승기", "010-1111-1111", 21},
		{"정지영", "010-2222-2222", 22},
		{"한지수", "010-3333-3333", 23},
	};

	int i;
	for (i = 0; i < 3; i++)
000719CC  mov         dword ptr [i],0  
000719D6  jmp         __$EncStackInitStart+16Bh (0719E7h)  
000719D8  mov         eax,dword ptr [i]  
000719DE  add         eax,1  
000719E1  mov         dword ptr [i],eax  
000719E7  cmp         dword ptr [i],3  
000719EE  jge         __$EncStackInitStart+1AAh (071A26h)  
		printf("%s %s %d\n", arr[i].name, arr[i].phoneNum, arr[i].age);
000719F0  imul        eax,dword ptr [i],2Ch  
000719F7  mov         ecx,dword ptr [ebp+eax-64h]  
000719FB  push        ecx  
000719FC  imul        edx,dword ptr [i],2Ch  
00071A03  lea         eax,[ebp+edx-78h]  
00071A07  push        eax  
00071A08  imul        ecx,dword ptr [i],2Ch  
00071A0F  lea         edx,arr[ecx]  
00071A16  push        edx  
00071A17  push        offset string "%s %s %d\n" (077B78h)  
00071A1C  call        _printf (0710D2h)  
00071A21  add         esp,10h  
00071A24  jmp         __$EncStackInitStart+15Ch (0719D8h)  

	return 0;
00071A26  xor         eax,eax  
}
00071A28  push        edx  
00071A29  mov         ecx,ebp  
00071A2B  push        eax  
00071A2C  lea         edx,ds:[71A58h]  
00071A32  call        @_RTC_CheckStackVars@8 (0711EAh)  
00071A37  pop         eax  
00071A38  pop         edx  
00071A39  pop         edi  
00071A3A  pop         esi  
00071A3B  pop         ebx  
00071A3C  mov         ecx,dword ptr [ebp-4]  
00071A3F  xor         ecx,ebp  
00071A41  call        @__security_check_cookie@4 (07114Fh)  
00071A46  add         esp,15Ch  
00071A4C  cmp         ebp,esp  
00071A4E  call        __RTC_CheckEsp (07124Eh)  
00071A53  mov         esp,ebp  
00071A55  pop         ebp  
00071A56  ret

 

#include <stdio.h>

struct person
{
	char name[20];
	char phoneNum[20];
	int age;
};

int main(void)
{
00007FF648191890  push        rbp  
00007FF648191892  push        rsi  
00007FF648191893  push        rdi  
00007FF648191894  sub         rsp,1B0h  
00007FF64819189B  lea         rbp,[rsp+20h]  
00007FF6481918A0  lea         rdi,[rsp+20h]  
00007FF6481918A5  mov         ecx,34h  
00007FF6481918AA  mov         eax,0CCCCCCCCh  
00007FF6481918AF  rep stos    dword ptr [rdi]  
00007FF6481918B1  mov         rax,qword ptr [__security_cookie (07FF64819D000h)]  
00007FF6481918B8  xor         rax,rbp  
00007FF6481918BB  mov         qword ptr [rbp+188h],rax  
00007FF6481918C2  lea         rcx,[__15F80836_InitStructArray@c (07FF6481A2008h)]  
00007FF6481918C9  call        __CheckForDebuggerJustMyCode (07FF64819136Bh)  
00007FF6481918CE  nop  
	struct person arr[3] = {
00007FF6481918CF  lea         rax,[arr]  
00007FF6481918D3  lea         rcx,[string "\xc0\xcc\xbd\xc2\xb1\xe2" (07FF64819ACA4h)]  
00007FF6481918DA  mov         rdi,rax  
00007FF6481918DD  mov         rsi,rcx  
00007FF6481918E0  mov         ecx,7  
00007FF6481918E5  rep movs    byte ptr [rdi],byte ptr [rsi]  
00007FF6481918E7  lea         rax,[rbp+17h]  
00007FF6481918EB  mov         rdi,rax  
00007FF6481918EE  xor         eax,eax  
00007FF6481918F0  mov         ecx,0Dh  
00007FF6481918F5  rep stos    byte ptr [rdi]  
00007FF6481918F7  lea         rax,[rbp+24h]  
00007FF6481918FB  lea         rcx,[string "010-1111-1111" (07FF64819ACB0h)]  
00007FF648191902  mov         rdi,rax  
00007FF648191905  mov         rsi,rcx  
00007FF648191908  mov         ecx,0Eh  
00007FF64819190D  rep movs    byte ptr [rdi],byte ptr [rsi]  
00007FF64819190F  lea         rax,[rbp+32h]  
00007FF648191913  mov         rdi,rax  
00007FF648191916  xor         eax,eax  
00007FF648191918  mov         ecx,6  
00007FF64819191D  rep stos    byte ptr [rdi]  
00007FF64819191F  mov         dword ptr [rbp+38h],15h  
00007FF648191926  lea         rax,[rbp+3Ch]  
00007FF64819192A  lea         rcx,[string "\xc1\xa4\xc1\xf6\xbf\xb5" (07FF64819ACC0h)]  
00007FF648191931  mov         rdi,rax  
00007FF648191934  mov         rsi,rcx  
00007FF648191937  mov         ecx,7  
00007FF64819193C  rep movs    byte ptr [rdi],byte ptr [rsi]  
00007FF64819193E  lea         rax,[rbp+43h]  
00007FF648191942  mov         rdi,rax  
00007FF648191945  xor         eax,eax  
00007FF648191947  mov         ecx,0Dh  
00007FF64819194C  rep stos    byte ptr [rdi]  
00007FF64819194E  lea         rax,[rbp+50h]  
00007FF648191952  lea         rcx,[string "010-2222-2222" (07FF64819ACC8h)]  
00007FF648191959  mov         rdi,rax  
00007FF64819195C  mov         rsi,rcx  
00007FF64819195F  mov         ecx,0Eh  
00007FF648191964  rep movs    byte ptr [rdi],byte ptr [rsi]  
00007FF648191966  lea         rax,[rbp+5Eh]  
00007FF64819196A  mov         rdi,rax  
00007FF64819196D  xor         eax,eax  
00007FF64819196F  mov         ecx,6  
00007FF648191974  rep stos    byte ptr [rdi]  
00007FF648191976  mov         dword ptr [rbp+64h],16h  
00007FF64819197D  lea         rax,[rbp+68h]  
00007FF648191981  lea         rcx,[string "\xc7\xd1\xc1\xf6\xbc\xf6" (07FF64819ACD8h)]  
00007FF648191988  mov         rdi,rax  
00007FF64819198B  mov         rsi,rcx  
00007FF64819198E  mov         ecx,7  
00007FF648191993  rep movs    byte ptr [rdi],byte ptr [rsi]  
00007FF648191995  lea         rax,[rbp+6Fh]  
00007FF648191999  mov         rdi,rax  
00007FF64819199C  xor         eax,eax  
00007FF64819199E  mov         ecx,0Dh  
00007FF6481919A3  rep stos    byte ptr [rdi]  
00007FF6481919A5  lea         rax,[rbp+7Ch]  
00007FF6481919A9  lea         rcx,[string "010-3333-3333" (07FF64819ACE0h)]  
00007FF6481919B0  mov         rdi,rax  
00007FF6481919B3  mov         rsi,rcx  
00007FF6481919B6  mov         ecx,0Eh  
00007FF6481919BB  rep movs    byte ptr [rdi],byte ptr [rsi]  
00007FF6481919BD  lea         rax,[rbp+8Ah]  
00007FF6481919C4  mov         rdi,rax  
00007FF6481919C7  xor         eax,eax  
00007FF6481919C9  mov         ecx,6  
00007FF6481919CE  rep stos    byte ptr [rdi]  
00007FF6481919D0  mov         dword ptr [rbp+90h],17h  
		{"이승기", "010-1111-1111", 21},
		{"정지영", "010-2222-2222", 22},
		{"한지수", "010-3333-3333", 23},
	};

	int i;
	for (i = 0; i < 3; i++)
00007FF6481919DA  mov         dword ptr [i],0  
00007FF6481919E4  jmp         __$EncStackInitStart+154h (07FF6481919F4h)  
00007FF6481919E6  mov         eax,dword ptr [i]  
00007FF6481919EC  inc         eax  
00007FF6481919EE  mov         dword ptr [i],eax  
00007FF6481919F4  cmp         dword ptr [i],3  
00007FF6481919FB  jge         __$EncStackInitStart+19Fh (07FF648191A3Fh)  
		printf("%s %s %d\n", arr[i].name, arr[i].phoneNum, arr[i].age);
00007FF6481919FD  movsxd      rax,dword ptr [i]  
00007FF648191A04  imul        rax,rax,2Ch  
00007FF648191A08  movsxd      rcx,dword ptr [i]  
00007FF648191A0F  imul        rcx,rcx,2Ch  
00007FF648191A13  lea         rcx,[rbp+rcx+24h]  
00007FF648191A18  movsxd      rdx,dword ptr [i]  
00007FF648191A1F  imul        rdx,rdx,2Ch  
00007FF648191A23  lea         rdx,arr[rdx]  
00007FF648191A28  mov         r9d,dword ptr [rbp+rax+38h]  
00007FF648191A2D  mov         r8,rcx  
00007FF648191A30  lea         rcx,[string "%s %s %d\n" (07FF64819ACF0h)]  
00007FF648191A37  call        printf (07FF648191195h)  
00007FF648191A3C  nop  
00007FF648191A3D  jmp         __$EncStackInitStart+146h (07FF6481919E6h)  

	return 0;
00007FF648191A3F  xor         eax,eax  
}
00007FF648191A41  mov         edi,eax  
00007FF648191A43  lea         rcx,[rbp-20h]  
00007FF648191A47  lea         rdx,[__xt_z+1E0h (07FF64819AC80h)]  
00007FF648191A4E  call        _RTC_CheckStackVars (07FF648191307h)  
00007FF648191A53  mov         eax,edi  
00007FF648191A55  mov         rcx,qword ptr [rbp+188h]  
00007FF648191A5C  xor         rcx,rbp  
00007FF648191A5F  call        __security_check_cookie (07FF6481911AEh)  
00007FF648191A64  lea         rsp,[rbp+190h]  
00007FF648191A6B  pop         rdi  
00007FF648191A6C  pop         rsi  
00007FF648191A6D  pop         rbp  
00007FF648191A6E  ret

 


 

#include <stdio.h>

struct point
{
	int xpos;
	int ypos;
};

int main(void)
{
00F81870  push        ebp  
00F81871  mov         ebp,esp  
00F81873  sub         esp,0F0h  
00F81879  push        ebx  
00F8187A  push        esi  
00F8187B  push        edi  
00F8187C  lea         edi,[ebp-30h]  
00F8187F  mov         ecx,0Ch  
00F81884  mov         eax,0CCCCCCCCh  
00F81889  rep stos    dword ptr es:[edi]  
00F8188B  mov         eax,dword ptr [__security_cookie (0F8A000h)]  
00F81890  xor         eax,ebp  
00F81892  mov         dword ptr [ebp-4],eax  
00F81895  mov         ecx,offset _394D9629_StructPointer@c (0F8C008h)  
00F8189A  call        @__CheckForDebuggerJustMyCode@4 (0F8132Ah)  
00F8189F  nop  
	struct point pos1 = { 1, 2 };
00F818A0  mov         dword ptr [pos1],1  
00F818A7  mov         dword ptr [ebp-0Ch],2  
	struct point pos2 = { 100,200 };
00F818AE  mov         dword ptr [pos2],64h  
00F818B5  mov         dword ptr [ebp-1Ch],0C8h  
	struct point* pptr = &pos1;
00F818BC  lea         eax,[pos1]  
00F818BF  mov         dword ptr [pptr],eax  

	(*pptr).xpos += 4;
00F818C2  mov         eax,dword ptr [pptr]  
00F818C5  mov         ecx,dword ptr [eax]  
00F818C7  add         ecx,4  
00F818CA  mov         edx,dword ptr [pptr]  
00F818CD  mov         dword ptr [edx],ecx  
	(*pptr).ypos += 5;
00F818CF  mov         eax,dword ptr [pptr]  
00F818D2  mov         ecx,dword ptr [eax+4]  
00F818D5  add         ecx,5  
00F818D8  mov         edx,dword ptr [pptr]  
00F818DB  mov         dword ptr [edx+4],ecx  
	printf("[%d %d]\n", pptr->xpos, pptr->ypos);
00F818DE  mov         eax,dword ptr [pptr]  
00F818E1  mov         ecx,dword ptr [eax+4]  
00F818E4  push        ecx  
00F818E5  mov         edx,dword ptr [pptr]  
00F818E8  mov         eax,dword ptr [edx]  
00F818EA  push        eax  
00F818EB  push        offset string "[%d %d]\n" (0F87B30h)  
00F818F0  call        _printf (0F810D2h)  
00F818F5  add         esp,0Ch  

	pptr = &pos2;
00F818F8  lea         eax,[pos2]  
00F818FB  mov         dword ptr [pptr],eax  
	pptr->xpos += 1;
00F818FE  mov         eax,dword ptr [pptr]  
00F81901  mov         ecx,dword ptr [eax]  
00F81903  add         ecx,1  
00F81906  mov         edx,dword ptr [pptr]  
00F81909  mov         dword ptr [edx],ecx  
	pptr->ypos += 2;
00F8190B  mov         eax,dword ptr [pptr]  
00F8190E  mov         ecx,dword ptr [eax+4]  
00F81911  add         ecx,2  
00F81914  mov         edx,dword ptr [pptr]  
00F81917  mov         dword ptr [edx+4],ecx  
	printf("[%d %d]\n", pptr->xpos, pptr->ypos);
00F8191A  mov         eax,dword ptr [pptr]  
00F8191D  mov         ecx,dword ptr [eax+4]  
00F81920  push        ecx  
00F81921  mov         edx,dword ptr [pptr]  
00F81924  mov         eax,dword ptr [edx]  
00F81926  push        eax  
00F81927  push        offset string "[%d %d]\n" (0F87B30h)  
00F8192C  call        _printf (0F810D2h)  
00F81931  add         esp,0Ch  

	return 0;
00F81934  xor         eax,eax  
}
00F81936  push        edx  
00F81937  mov         ecx,ebp  
00F81939  push        eax  
00F8193A  lea         edx,ds:[0F81968h]  
00F81940  call        @_RTC_CheckStackVars@8 (0F811EAh)  
00F81945  pop         eax  
00F81946  pop         edx  
00F81947  pop         edi  
00F81948  pop         esi  
00F81949  pop         ebx  
00F8194A  mov         ecx,dword ptr [ebp-4]  
00F8194D  xor         ecx,ebp  
00F8194F  call        @__security_check_cookie@4 (0F8114Fh)  
00F81954  add         esp,0F0h  
00F8195A  cmp         ebp,esp  
00F8195C  call        __RTC_CheckEsp (0F8124Eh)  
00F81961  mov         esp,ebp  
00F81963  pop         ebp  
00F81964  ret

 


 

#include <stdio.h>

struct point
{
	int xpos;
	int ypos;
};

struct person
{
	char name[20];
	char phoneNum[20];
	int age;
};

int main(void)
{
00411870  push        ebp  
00411871  mov         ebp,esp  
00411873  sub         esp,108h  
00411879  push        ebx  
0041187A  push        esi  
0041187B  push        edi  
0041187C  lea         edi,[ebp-48h]  
0041187F  mov         ecx,12h  
00411884  mov         eax,0CCCCCCCCh  
00411889  rep stos    dword ptr es:[edi]  
0041188B  mov         eax,dword ptr [__security_cookie (041A000h)]  
00411890  xor         eax,ebp  
00411892  mov         dword ptr [ebp-4],eax  
00411895  mov         ecx,offset _323D8EA8_StructValAddress@c (041C008h)  
0041189A  call        @__CheckForDebuggerJustMyCode@4 (041132Ah)  
0041189F  nop  
	struct point pos = { 10,20 };
004118A0  mov         dword ptr [pos],0Ah  
004118A7  mov         dword ptr [ebp-0Ch],14h  
	struct person man = { "Lee승기", "010-1111-1111", 21 };
004118AE  mov         eax,dword ptr [string "Lee\xbd\xc2\xb1\xe2" (0417B30h)]  
004118B3  mov         ecx,dword ptr ds:[417B34h]  
004118B9  mov         dword ptr [man],eax  
004118BC  mov         dword ptr [ebp-40h],ecx  
004118BF  xor         eax,eax  
004118C1  mov         dword ptr [ebp-3Ch],eax  
004118C4  mov         dword ptr [ebp-38h],eax  
004118C7  mov         dword ptr [ebp-34h],eax  
004118CA  mov         eax,dword ptr [string "010-1111-1111" (0417B3Ch)]  
004118CF  mov         dword ptr [ebp-30h],eax  
004118D2  mov         ecx,dword ptr ds:[417B40h]  
004118D8  mov         dword ptr [ebp-2Ch],ecx  
004118DB  mov         edx,dword ptr ds:[417B44h]  
004118E1  mov         dword ptr [ebp-28h],edx  
004118E4  mov         ax,word ptr ds:[00417B48h]  
004118EA  mov         word ptr [ebp-24h],ax  
004118EE  xor         eax,eax  
004118F0  mov         dword ptr [ebp-22h],eax  
004118F3  mov         word ptr [ebp-1Eh],ax  
004118F7  mov         dword ptr [ebp-1Ch],15h  

	printf("%p %p\n", &pos, &pos.xpos);
004118FE  lea         eax,[pos]  
00411901  push        eax  
00411902  lea         ecx,[pos]  
00411905  push        ecx  
00411906  push        offset string "%p %p\n" (0417B4Ch)  
0041190B  call        _printf (04110D2h)  
00411910  add         esp,0Ch  
	printf("%p %p\n", &man, &man.name);
00411913  lea         eax,[man]  
00411916  push        eax  
00411917  lea         ecx,[man]  
0041191A  push        ecx  
0041191B  push        offset string "%p %p\n" (0417B4Ch)  
00411920  call        _printf (04110D2h)  
00411925  add         esp,0Ch  

	return 0;
00411928  xor         eax,eax  
}
0041192A  push        edx  
0041192B  mov         ecx,ebp  
0041192D  push        eax  
0041192E  lea         edx,ds:[41195Ch]  
00411934  call        @_RTC_CheckStackVars@8 (04111EAh)  
00411939  pop         eax  
0041193A  pop         edx  
0041193B  pop         edi  
0041193C  pop         esi  
0041193D  pop         ebx  
0041193E  mov         ecx,dword ptr [ebp-4]  
00411941  xor         ecx,ebp  
00411943  call        @__security_check_cookie@4 (041114Fh)  
00411948  add         esp,108h  
0041194E  cmp         ebp,esp  
00411950  call        __RTC_CheckEsp (041124Eh)  
00411955  mov         esp,ebp  
00411957  pop         ebp  
00411958  ret

 


 

int main(void)
{
007C1AA0  push        ebp  
007C1AA1  mov         ebp,esp  
007C1AA3  sub         esp,0D0h  
007C1AA9  push        ebx  
007C1AAA  push        esi  
007C1AAB  push        edi  
007C1AAC  lea         edi,[ebp-10h]  
007C1AAF  mov         ecx,4  
007C1AB4  mov         eax,0CCCCCCCCh  
007C1AB9  rep stos    dword ptr es:[edi]  
007C1ABB  mov         ecx,offset _7FD125B9_StructValAndFunction@c (07CC008h)  
007C1AC0  call        @__CheckForDebuggerJustMyCode@4 (07C1343h)  
007C1AC5  nop  
	Point curPos = GetCurrentPosition();
007C1AC6  call        _GetCurrentPosition (07C12C1h)  
007C1ACB  mov         dword ptr [curPos],eax  
007C1ACE  mov         dword ptr [ebp-8],edx  
	ShowPosition(curPos);
007C1AD1  mov         eax,dword ptr [ebp-8]  
007C1AD4  push        eax  
007C1AD5  mov         ecx,dword ptr [curPos]  
007C1AD8  push        ecx  
007C1AD9  call        _ShowPosition (07C122Bh)  
007C1ADE  add         esp,8  

	return 0;
007C1AE1  xor         eax,eax  
}
007C1AE3  push        edx  
007C1AE4  mov         ecx,ebp  
007C1AE6  push        eax  
007C1AE7  lea         edx,ds:[7C1B08h]  
007C1AED  call        @_RTC_CheckStackVars@8 (07C11F4h)  
007C1AF2  pop         eax  
007C1AF3  pop         edx  
007C1AF4  pop         edi  
007C1AF5  pop         esi  
007C1AF6  pop         ebx  
007C1AF7  add         esp,0D0h  
007C1AFD  cmp         ebp,esp  
007C1AFF  call        __RTC_CheckEsp (07C125Dh)  
007C1B04  mov         esp,ebp  
007C1B06  pop         ebp  
007C1B07  ret

 


 

* 릴리즈 빌드, 최적화 컴파일러 OFF

 

#include <stdio.h>

typedef struct person
{
	char name[20];
	char phoneNum[20];
	int age;
}Person;

void ShowPersionInfo(Person man)
{
00601100  push        ebp  
00601101  mov         ebp,esp  
	printf("name: %s\n", man.name);
00601103  lea         eax,[ebp+8]  
00601106  push        eax  
00601107  push        60309Ch  
0060110C  call        00601050  
00601111  add         esp,8  
	printf("phone: %s\n", man.phoneNum);
00601114  lea         ecx,[ebp+1Ch]  
00601117  push        ecx  
00601118  push        603090h  
0060111D  call        00601050  
00601122  add         esp,8  
	printf("age: %d\n", man.age);
00601125  mov         edx,dword ptr [ebp+30h]  
00601128  push        edx  
00601129  push        603084h  
0060112E  call        00601050  
00601133  add         esp,8  
}
00601136  pop         ebp  
00601137  ret  

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

Person ReadPersonInfo(void)
{
00601140  push        ebp  
00601141  mov         ebp,esp  
	Person man;
	printf("name? "); scanf_s("%s", man.name, sizeof(man.name));
00601143  push        60307Ch  
00601148  call        00601050  
0060114D  add         esp,4  
00601150  push        14h  
00601152  mov         eax,dword ptr [ebp+8]  
00601155  push        eax  
00601156  push        603078h  
0060115B  call        006010C0  
00601160  add         esp,0Ch  
	printf("phone? "); scanf_s("%s", man.phoneNum, sizeof(man.phoneNum));
00601163  push        603070h  
00601168  call        00601050  
0060116D  add         esp,4  
00601170  push        14h  
00601172  mov         ecx,dword ptr [ebp+8]  
00601175  add         ecx,14h  
00601178  push        ecx  
00601179  push        60306Ch  
0060117E  call        006010C0  
00601183  add         esp,0Ch  
	printf("age? "); scanf_s("%d", &man.age);
00601186  push        603064h  
0060118B  call        00601050  
00601190  add         esp,4  
00601193  mov         edx,dword ptr [ebp+8]  
00601196  add         edx,28h  
00601199  push        edx  
0060119A  push        603060h  
0060119F  call        006010C0  
006011A4  add         esp,8  
	return man;
006011A7  mov         eax,dword ptr [ebp+8]  
}
006011AA  pop         ebp  
006011AB  ret  

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

int main(void)
{
006011B0  push        ebp  
006011B1  mov         ebp,esp  
006011B3  sub         esp,58h  
006011B6  push        esi  
006011B7  push        edi  
	Person man = ReadPersonInfo();
006011B8  lea         eax,[ebp-58h]  
006011BB  push        eax  
006011BC  call        00601140  
006011C1  add         esp,4  
006011C4  mov         ecx,0Bh  
006011C9  mov         esi,eax  
006011CB  lea         edi,[ebp-2Ch]  
006011CE  rep movs    dword ptr es:[edi],dword ptr [esi]  
	ShowPersionInfo(man);
006011D0  sub         esp,2Ch  
006011D3  mov         ecx,0Bh  
006011D8  lea         esi,[ebp-2Ch]  
006011DB  mov         edi,esp  
006011DD  rep movs    dword ptr es:[edi],dword ptr [esi]  
006011DF  call        00601100  
006011E4  add         esp,2Ch  
	return 0;
006011E7  xor         eax,eax  
}
006011E9  pop         edi  
006011EA  pop         esi  
006011EB  mov         esp,ebp  
006011ED  pop         ebp  
006011EE  ret

 

 


 

* 구조체 변수를 대상으로 할 수 있는 연산 : 대입 연산

   ㄴ 구조체 변수간 대입 연산의 결과로 멤버 대 멤버의 복사가 이뤄짐

 

#include <stdio.h>

typedef struct point
{
	int xpos;
	int ypos;
}Point;

int main(void)
{
00C61080  push        ebp  
00C61081  mov         ebp,esp  
00C61083  sub         esp,10h  
	Point pos1 = { 1,2 };
00C61086  mov         dword ptr [pos1],1  
00C6108D  mov         dword ptr [ebp-4],2  
	Point pos2;
	pos2 = pos1;
00C61094  mov         eax,dword ptr [pos1]  
00C61097  mov         ecx,dword ptr [ebp-4]  
00C6109A  mov         dword ptr [pos2],eax  
00C6109D  mov         dword ptr [ebp-0Ch],ecx  

	printf("크기 : %d\n", sizeof(pos1));
00C610A0  push        8  
00C610A2  push        0C63084h  
00C610A7  call        printf (0C61040h)  
00C610AC  add         esp,8  
	printf("[%d, %d]\n", pos1.xpos, pos1.ypos);
00C610AF  mov         edx,dword ptr [ebp-4]  
00C610B2  push        edx  
00C610B3  mov         eax,dword ptr [pos1]  
00C610B6  push        eax  
00C610B7  push        0C63078h  
00C610BC  call        printf (0C61040h)  
00C610C1  add         esp,0Ch  

	printf("크기 : %d\n", sizeof(pos2));
00C610C4  push        8  
00C610C6  push        0C6306Ch  
00C610CB  call        printf (0C61040h)  
00C610D0  add         esp,8  
	printf("[%d, %d]\n", pos2.xpos, pos2.ypos);
00C610D3  mov         ecx,dword ptr [ebp-0Ch]  
00C610D6  push        ecx  
00C610D7  mov         edx,dword ptr [pos2]  
00C610DA  push        edx  
00C610DB  push        0C63060h  
00C610E0  call        printf (0C61040h)  
00C610E5  add         esp,0Ch  

	return 0;
00C610E8  xor         eax,eax  
}
00C610EA  mov         esp,ebp  
00C610EC  pop         ebp  
00C610ED  ret

 


 

#include <stdio.h>

typedef struct point
{
	int xpos;
	int ypos;
} Point;

Point AddPoint(Point pos1, Point pos2)
{
00F21080  push        ebp  
00F21081  mov         ebp,esp  
00F21083  sub         esp,8  
	Point pos = { pos1.xpos + pos2.xpos, pos1.ypos + pos2.ypos };
00F21086  mov         eax,dword ptr [pos1]  
00F21089  add         eax,dword ptr [pos2]  
00F2108C  mov         dword ptr [pos],eax  
00F2108F  mov         ecx,dword ptr [ebp+0Ch]  
00F21092  add         ecx,dword ptr [ebp+14h]  
00F21095  mov         dword ptr [ebp-4],ecx  
	return pos;
00F21098  mov         eax,dword ptr [pos]  
00F2109B  mov         edx,dword ptr [ebp-4]  
}
00F2109E  mov         esp,ebp  
00F210A0  pop         ebp  
00F210A1  ret  

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

Point MinusPoint(Point pos1, Point pos2)
{
00F210B0  push        ebp  
00F210B1  mov         ebp,esp  
00F210B3  sub         esp,8  
	Point pos = { pos1.xpos - pos2.xpos, pos1.ypos - pos2.ypos };
00F210B6  mov         eax,dword ptr [pos1]  
00F210B9  sub         eax,dword ptr [pos2]  
00F210BC  mov         dword ptr [pos],eax  
00F210BF  mov         ecx,dword ptr [ebp+0Ch]  
00F210C2  sub         ecx,dword ptr [ebp+14h]  
00F210C5  mov         dword ptr [ebp-4],ecx  
	return pos;
00F210C8  mov         eax,dword ptr [pos]  
00F210CB  mov         edx,dword ptr [ebp-4]  
}
00F210CE  mov         esp,ebp  
00F210D0  pop         ebp  
00F210D1  ret 

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

void main(void)
{
00F210E0  push        ebp  
00F210E1  mov         ebp,esp  
00F210E3  sub         esp,18h  
	Point pos1 = { 5,6 };
00F210E6  mov         dword ptr [pos1],5  
00F210ED  mov         dword ptr [ebp-14h],6  
	Point pos2 = { 2,9 };
00F210F4  mov         dword ptr [pos2],2  
00F210FB  mov         dword ptr [ebp-0Ch],9  
	Point result;

	result = AddPoint(pos1, pos2);
00F21102  mov         eax,dword ptr [ebp-0Ch]  
00F21105  push        eax  
00F21106  mov         ecx,dword ptr [pos2]  
00F21109  push        ecx  
00F2110A  mov         edx,dword ptr [ebp-14h]  
00F2110D  push        edx  
00F2110E  mov         eax,dword ptr [pos1]  
00F21111  push        eax  
00F21112  call        AddPoint (0F21080h)  
00F21117  add         esp,10h  
00F2111A  mov         dword ptr [result],eax  
00F2111D  mov         dword ptr [ebp-4],edx  
	printf("[%d, %d]\n", result.xpos, result.ypos);
00F21120  mov         ecx,dword ptr [ebp-4]  
00F21123  push        ecx  
00F21124  mov         edx,dword ptr [result]  
00F21127  push        edx  
00F21128  push        0F2306Ch  
00F2112D  call        printf (0F21040h)  
00F21132  add         esp,0Ch  

	result = MinusPoint(pos1, pos2);
00F21135  mov         eax,dword ptr [ebp-0Ch]  
00F21138  push        eax  
00F21139  mov         ecx,dword ptr [pos2]  
00F2113C  push        ecx  
00F2113D  mov         edx,dword ptr [ebp-14h]  
00F21140  push        edx  
00F21141  mov         eax,dword ptr [pos1]  
00F21144  push        eax  
00F21145  call        MinusPoint (0F210B0h)  
00F2114A  add         esp,10h  
00F2114D  mov         dword ptr [result],eax  
00F21150  mov         dword ptr [ebp-4],edx  
	printf("[%d, %d]\n", result.xpos, result.ypos);
00F21153  mov         ecx,dword ptr [ebp-4]  
00F21156  push        ecx  
00F21157  mov         edx,dword ptr [result]  
00F2115A  push        edx  
00F2115B  push        0F23060h  
00F21160  call        printf (0F21040h)  
00F21165  add         esp,0Ch  

	return 0;
00F21168  xor         eax,eax  
}
00F2116A  mov         esp,ebp  
00F2116C  pop         ebp  
00F2116D  ret

 

* eax, edx로 리턴해서

   mov    eax, dword ptr [pos]

   mov    edx, dword ptr [ebp - 4]

 

* result에 값 대입

   mov    dword ptr [result], eax

   mov    dword ptr [ebp-4], edx

 

#include <stdio.h>

typedef struct point
{
	int xpos;
	int ypos;
	int testPos;
} Point;

Point AddPoint(Point pos1, Point pos2)
{
00BE1080  push        ebp  
00BE1081  mov         ebp,esp  
	Point pos = { pos1.xpos + pos2.xpos, pos1.ypos + pos2.ypos };
00BE1083  mov         eax,dword ptr [ebp+0Ch]  
00BE1086  add         eax,dword ptr [ebp+18h]  
00BE1089  mov         ecx,dword ptr [ebp+8]  
00BE108C  mov         dword ptr [ecx],eax  
00BE108E  mov         edx,dword ptr [ebp+10h]  
00BE1091  add         edx,dword ptr [ebp+1Ch]  
00BE1094  mov         eax,dword ptr [ebp+8]  
00BE1097  mov         dword ptr [eax+4],edx  
00BE109A  xor         ecx,ecx  
00BE109C  mov         edx,dword ptr [ebp+8]  
00BE109F  add         edx,8  
00BE10A2  mov         dword ptr [edx],ecx  
	return pos;
00BE10A4  mov         eax,dword ptr [ebp+8]  
}
00BE10A7  pop         ebp  
00BE10A8  ret

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

Point MinusPoint(Point pos1, Point pos2)
{
00BE10B0  push        ebp  
00BE10B1  mov         ebp,esp  
	Point pos = { pos1.xpos - pos2.xpos, pos1.ypos - pos2.ypos };
00BE10B3  mov         eax,dword ptr [ebp+0Ch]  
00BE10B6  sub         eax,dword ptr [ebp+18h]  
00BE10B9  mov         ecx,dword ptr [ebp+8]  
00BE10BC  mov         dword ptr [ecx],eax  
00BE10BE  mov         edx,dword ptr [ebp+10h]  
00BE10C1  sub         edx,dword ptr [ebp+1Ch]  
00BE10C4  mov         eax,dword ptr [ebp+8]  
00BE10C7  mov         dword ptr [eax+4],edx  
00BE10CA  xor         ecx,ecx  
00BE10CC  mov         edx,dword ptr [ebp+8]  
00BE10CF  add         edx,8  
00BE10D2  mov         dword ptr [edx],ecx  
	return pos;
00BE10D4  mov         eax,dword ptr [ebp+8]  
}
00BE10D7  pop         ebp  
00BE10D8  ret 

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

void main(void)
{
00BE10E0  push        ebp  
00BE10E1  mov         ebp,esp  
00BE10E3  sub         esp,3Ch  
	Point pos1 = { 5,6, 100 };
00BE10E6  mov         dword ptr [ebp-24h],5  
00BE10ED  mov         dword ptr [ebp-20h],6  
00BE10F4  mov         dword ptr [ebp-1Ch],64h  
	Point pos2 = { 2,9, 200 };
00BE10FB  mov         dword ptr [ebp-18h],2  
00BE1102  mov         dword ptr [ebp-14h],9  
00BE1109  mov         dword ptr [ebp-10h],0C8h  
	Point result;

	result = AddPoint(pos1, pos2);
00BE1110  sub         esp,0Ch  
00BE1113  mov         eax,esp  
00BE1115  mov         ecx,dword ptr [ebp-18h]  
00BE1118  mov         dword ptr [eax],ecx  
00BE111A  mov         edx,dword ptr [ebp-14h]  
00BE111D  mov         dword ptr [eax+4],edx  
00BE1120  mov         ecx,dword ptr [ebp-10h]  
00BE1123  mov         dword ptr [eax+8],ecx  
00BE1126  sub         esp,0Ch  
00BE1129  mov         edx,esp  
00BE112B  mov         eax,dword ptr [ebp-24h]  
00BE112E  mov         dword ptr [edx],eax  
00BE1130  mov         ecx,dword ptr [ebp-20h]  
00BE1133  mov         dword ptr [edx+4],ecx  
00BE1136  mov         eax,dword ptr [ebp-1Ch]  
00BE1139  mov         dword ptr [edx+8],eax  
00BE113C  lea         ecx,[ebp-30h]  
00BE113F  push        ecx  
00BE1140  call        00BE1080  
00BE1145  add         esp,1Ch  
00BE1148  mov         edx,dword ptr [eax]  
00BE114A  mov         dword ptr [ebp-0Ch],edx  
00BE114D  mov         ecx,dword ptr [eax+4]  
00BE1150  mov         dword ptr [ebp-8],ecx  
00BE1153  mov         edx,dword ptr [eax+8]  
00BE1156  mov         dword ptr [ebp-4],edx  
	printf("[%d, %d]\n", result.xpos, result.ypos);
00BE1159  mov         eax,dword ptr [ebp-8]  
00BE115C  push        eax  
00BE115D  mov         ecx,dword ptr [ebp-0Ch]  
00BE1160  push        ecx  
00BE1161  push        0BE306Ch  
00BE1166  call        00BE1040  
00BE116B  add         esp,0Ch  

	result = MinusPoint(pos1, pos2);
00BE116E  sub         esp,0Ch  
00BE1171  mov         edx,esp  
00BE1173  mov         eax,dword ptr [ebp-18h]  
00BE1176  mov         dword ptr [edx],eax  
00BE1178  mov         ecx,dword ptr [ebp-14h]  
00BE117B  mov         dword ptr [edx+4],ecx  
00BE117E  mov         eax,dword ptr [ebp-10h]  
00BE1181  mov         dword ptr [edx+8],eax  
00BE1184  sub         esp,0Ch  
00BE1187  mov         ecx,esp  
00BE1189  mov         edx,dword ptr [ebp-24h]  
00BE118C  mov         dword ptr [ecx],edx  
00BE118E  mov         eax,dword ptr [ebp-20h]  
00BE1191  mov         dword ptr [ecx+4],eax  
00BE1194  mov         edx,dword ptr [ebp-1Ch]  
00BE1197  mov         dword ptr [ecx+8],edx  
00BE119A  lea         eax,[ebp-3Ch]  
00BE119D  push        eax  
00BE119E  call        00BE10B0  
00BE11A3  add         esp,1Ch  
00BE11A6  mov         ecx,dword ptr [eax]  
00BE11A8  mov         dword ptr [ebp-0Ch],ecx  
00BE11AB  mov         edx,dword ptr [eax+4]  
00BE11AE  mov         dword ptr [ebp-8],edx  
00BE11B1  mov         eax,dword ptr [eax+8]  
00BE11B4  mov         dword ptr [ebp-4],eax  
	printf("[%d, %d]\n", result.xpos, result.ypos);
00BE11B7  mov         ecx,dword ptr [ebp-8]  
00BE11BA  push        ecx  
00BE11BB  mov         edx,dword ptr [ebp-0Ch]  
00BE11BE  push        edx  
00BE11BF  push        0BE3060h  
00BE11C4  call        00BE1040  
00BE11C9  add         esp,0Ch  

	return 0;
00BE11CC  xor         eax,eax  
}
00BE11CE  mov         esp,ebp  
00BE11D0  pop         ebp  
00BE11D1  ret

 

* 리턴 값을 result에 대입

   mov         edx,dword ptr [eax]
   mov         dword ptr [result],edx
   mov         ecx,dword ptr [eax+4]
   mov         dword ptr [ebp-8],ecx
   mov         edx,dword ptr [eax+8]
   mov         dword ptr [ebp-4],edx

 

* AddPoint 함수, Point 리턴

 


 

* 구조체 변수를 초기화하는 경우에도

   배열의 초기화와 마찬가지로 초기화하지 않은 일부 멤버에 대해서는 0으로 초기화가 진행된다

 


 

#include <stdio.h>

typedef struct sbox
{
	int mem1;
	int mem2;
	double mem3;
} SBox;

typedef union ubox
{
	int num1;
	int num2;
	double num3;
} UBox;

int main(void)
{
00731080  push        ebp  
00731081  mov         ebp,esp  
00731083  sub         esp,1Ch  
00731086  mov         eax,dword ptr [__security_cookie (0733000h)]  
0073108B  xor         eax,ebp  
0073108D  mov         dword ptr [ebp-4],eax  
	SBox sbx;
	UBox ubx;

	printf("%p %p %p\n", &sbx.mem1, &sbx.mem2, &sbx.mem3);
00731090  lea         eax,[ebp-14h]  
00731093  push        eax  
00731094  lea         ecx,[ebp-18h]  
00731097  push        ecx  
00731098  lea         edx,[sbx]  
0073109B  push        edx  
0073109C  push        73306Ch  
007310A1  call        printf (0731040h)  
007310A6  add         esp,10h  
	printf("%p %p %p\n", &ubx.num1, &ubx.num2, &ubx.num3);
007310A9  lea         eax,[ubx]  
007310AC  push        eax  
007310AD  lea         ecx,[ubx]  
007310B0  push        ecx  
007310B1  lea         edx,[ubx]  
007310B4  push        edx  
007310B5  push        733060h  
007310BA  call        printf (0731040h)  
007310BF  add         esp,10h  

	return 0;
007310C2  xor         eax,eax  
}
007310C4  mov         ecx,dword ptr [ebp-4]  
007310C7  xor         ecx,ebp  
007310C9  call        __security_check_cookie (07310D2h)  
007310CE  mov         esp,ebp  
007310D0  pop         ebp  
007310D1  ret

 


 

#include <stdio.h>

typedef union ubox
{
	int mem1;
	int mem2;
	double mem3;
} UBox;

int main(void)
{
006C1080  push        ebp  
006C1081  mov         ebp,esp  
006C1083  sub         esp,8  
	UBox ubx;
	ubx.mem1 = 20;
006C1086  mov         dword ptr [ubx],14h  

	printf("%d\n", ubx.mem2);
006C108D  mov         eax,dword ptr [ubx]  
006C1090  push        eax  
006C1091  push        6C3080h  
006C1096  call        printf (06C1040h)  
006C109B  add         esp,8  

	ubx.mem3 = 7.15;
006C109E  movsd       xmm0,mmword ptr [__real@401c99999999999a (06C2100h)]  
006C10A6  movsd       mmword ptr [ubx],xmm0  

	printf("%d \n", ubx.mem1);
006C10AB  mov         ecx,dword ptr [ubx]  
006C10AE  push        ecx  
006C10AF  push        6C3078h  
006C10B4  call        printf (06C1040h)  
006C10B9  add         esp,8  
	printf("%d \n", ubx.mem2);
006C10BC  mov         edx,dword ptr [ubx]  
006C10BF  push        edx  
006C10C0  push        6C3070h  
006C10C5  call        printf (06C1040h)  
	printf("%g \n", ubx.mem3);
006C10CA  movsd       xmm0,mmword ptr [ubx]  
006C10CF  movsd       mmword ptr [esp],xmm0  
006C10D4  push        6C3068h  
006C10D9  call        printf (06C1040h)  
	printf("%d \n", ubx.mem3);
006C10DE  add         esp,4  
006C10E1  movsd       xmm0,mmword ptr [ubx]  
006C10E6  movsd       mmword ptr [esp],xmm0  
006C10EB  push        6C3060h  
006C10F0  call        printf (06C1040h)  
006C10F5  add         esp,0Ch  

	return 0;
006C10F8  xor         eax,eax  
}
006C10FA  mov         esp,ebp  
006C10FC  pop         ebp  
006C10FD  ret

 


 

* 구조체와 공용체는 자료형의 정의에 의미

   열거형은 둘 이상의 연관이 있는 이름을 상수로 선언함으로써 프로그램의 가독성을 높임