#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
* 구조체와 공용체는 자료형의 정의에 의미
열거형은 둘 이상의 연관이 있는 이름을 상수로 선언함으로써 프로그램의 가독성을 높임
'IT공부 > IT서적' 카테고리의 다른 글
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 11장. 쓰레드의 이해 (0) | 2025.02.04 |
---|---|
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 10장. 컴퓨터 구조 - 3 (0) | 2025.01.30 |
[윤성우 열혈 C프로그래밍] 디버깅 빌드, 어셈블리 코드 - Chapter21 (0) | 2025.01.30 |
[윤성우 열혈 C프로그래밍] 디버깅 빌드, 어셈블리 코드 - Chapter16, Chapter17, Chapter18, Chapter19 (0) | 2025.01.29 |
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 9장. 스케줄링 알고리즘과 우선순위 (0) | 2025.01.28 |