ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

VC++ÖнṹÌ帳ֵºÍmemcpyµÄ±È½Ï
2015-07-24 06:51:44 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:59´Î
Tags£º½á¹¹ memcpy ±È½Ï

// Test1

typedef struct

{

int nValue;

BYTE nValue2[4];

}ST_TEST;

int main()

{

ST_TEST sTest1 = {0};

ST_TEST sTest2 = {0};

sTest2 = sTest1;

memcpy(&sTest2, &sTest1, sizeof(sTest1));

return 0;

}

// Disassembly

typedef struct

{

int nValue;

BYTE nValue2[4];

}ST_TEST;

int main()

{

004196B0 push ebp

004196B1 mov ebp,esp

004196B3 sub esp,0E4h

004196B9 push ebx

004196BA push esi

004196BB push edi

004196BC lea edi,[ebp-0E4h]

004196C2 mov ecx,39h

004196C7 mov eax,0CCCCCCCCh

004196CC rep stos dword ptr es:[edi]

004196CE mov eax,dword ptr [___security_cookie (428080h)]

004196D3 xor eax,ebp

004196D5 mov dword ptr [ebp-4],eax

ST_TEST sTest1 = {0};

004196D8 mov dword ptr [ebp-10h],0

004196DF xor eax,eax

004196E1 mov dword ptr [ebp-0Ch],eax

ST_TEST sTest2 = {0};

004196E4 mov dword ptr [ebp-20h],0

004196EB xor eax,eax

004196ED mov dword ptr [ebp-1Ch],eax

sTest2 = sTest1;

004196F0 mov eax,dword ptr [ebp-10h]

004196F3 mov dword ptr [ebp-20h],eax

004196F6 mov ecx,dword ptr [ebp-0Ch]

004196F9 mov dword ptr [ebp-1Ch],ecx

memcpy(&sTest2, &sTest1, sizeof(sTest1));

004196FC push 8

004196FE lea eax,[ebp-10h]

00419701 push eax

00419702 lea ecx,[ebp-20h]

00419705 push ecx

00419706 call @ILT+980(_memcpy) (4113D9h)

0041970B add esp,0Ch

return 0;

0041970E xor eax,eax

}

// Test2

typedef struct

{

int nValue;

BYTE bValue[4092];

}ST_TEST;

int main()

{

ST_TEST sTest1 = {0};

ST_TEST sTest2 = {0};

sTest2 = sTest1;

memcpy(&sTest2, &sTest1, sizeof(sTest1));

return 0;

}

// Disassembly

typedef struct

{

int nValue;

BYTE bValue[4092];

}ST_TEST;

int main()

{

004196B0 push ebp

004196B1 mov ebp,esp

004196B3 mov eax,20D4h

004196B8 call @ILT+415(__chkstk) (4111A4h)

004196BD push ebx

004196BE push esi

004196BF push edi

004196C0 lea edi,[ebp-20D4h]

004196C6 mov ecx,835h

004196CB mov eax,0CCCCCCCCh

004196D0 rep stos dword ptr es:[edi]

004196D2 mov eax,dword ptr [___security_cookie (428080h)]

004196D7 xor eax,ebp

004196D9 mov dword ptr [ebp-4],eax

ST_TEST sTest1 = {0};

004196DC mov dword ptr [ebp-1008h],0

004196E6 push 0FFCh

004196EB push 0

004196ED lea eax,[ebp-1004h]

004196F3 push eax

004196F4 call @ILT+510(_memset) (411203h)

004196F9 add esp,0Ch

ST_TEST sTest2 = {0};

004196FC mov dword ptr [ebp-2010h],0

00419706 push 0FFCh

0041970B push 0

0041970D lea eax,[ebp-200Ch]

00419713 push eax

00419714 call @ILT+510(_memset) (411203h)

00419719 add esp,0Ch

sTest2 = sTest1;

0041971C push 1000h

00419721 lea eax,[ebp-1008h]

00419727 push eax

00419728 lea ecx,[ebp-2010h]

0041972E push ecx

0041972F call @ILT+980(_memcpy) (4113D9h)

00419734 add esp,0Ch

memcpy(&sTest2, &sTest1, sizeof(sTest1));

00419737 push 1000h

0041973C lea eax,[ebp-1008h]

00419742 push eax

00419743 lea ecx,[ebp-2010h]

00419749 push ecx

0041974A call @ILT+980(_memcpy) (4113D9h)

0041974F add esp,0Ch

return 0;

00419752 xor eax,eax

}


ͨ¹ýÉÏÃæµÄµÄÁ½·Ý²âÊÔ´úÂë,ÎÒÃÇ¿ÉÒÔ¿´³ö,½á¹¹µÄÖ±½Ó¸³Öµ(ĬÈϽṹÌ帳ֵº¯Êý)ÓëmemcpyÖ®¼äµÄÒìͬ.

Àý1ÖÐ,½á¹¹ÌåСÓÚ4096ʱ,¸³ÖµÊÇͨ¹ý½á¹¹ÌåÖÐÿ¸ö±äÁ¿µÄ¸³ÖµÀ´Íê³ÉµÄ.

Àý2ÖÐ,½á¹¹Ìå´óÓÚµÈÓÚ4096ʱ,½á¹¹Ì帳ֵÓëmemcpyµÄЧ¹ûÊÇÒ»ÑùµÄ.ÒòΪÎÒÃÇͨ¹ý´úÂëµÄ·´»ã±à,¿ÉÒÔ¿´³ö±àÒëÆ÷ÒѾ­½«´úÂëÓÅ»¯³ÉÒ»ÑùµÄ»ã±à´úÂëÁË.

ËùÒÔ,ÀíÂÛÉÏÀ´Ëµ,Õë¶Ô½á¹¹Ìåµ÷ÓÃmemcpyµÄЧ¹ûÓëÖ±½Ó¸³Öµ»ù±¾ÉÏÊÇÒ»ÑùµÄ.

¶øÇÒ°´ÕÕ»ã±àµÄ½á¹û,Ö±½Ó¸³ÖµµÄ»ã±à´úÂëÉÙÓÚmemcpyµÄ»ã±à´úÂë,ËùÒÔ¸üÍÆ¼öʹÓýṹÌåµÄÖ±½Ó¸³Öµ(×¢Òâ,ÕâÀïµÄ½á¹¹ÌåÊÇָûÓÐÖØÔØ¸³Öµº¯ÊýµÄ)

¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºUVA 10844 - Bloques (µÚ¶þÀàË¹ÌØ.. ÏÂһƪ£º¶þ²æÊ÷×ܽá¨D½¨Ê÷ºÍ4ÖÖ±éÀú·½Ê½£..

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ: