|
发表于 2006-12-2 11:17:45
|
显示全部楼层
#include "stdafx.h"
char *strcpy( char*strDest,const char*strSrc)
{[/COLOR]
004113A0 push ebp
004113A1 mov ebp,esp
004113A3 sub esp,0D0h
004113A9 push ebx
004113AA push esi
004113AB push edi
004113AC lea edi,[ebp-0D0h]
004113B2 mov ecx,34h
004113B7 mov eax,0CCCCCCCCh
004113BC rep stos dword ptr es:[edi]
char *address = strDest;[/COLOR]
004113BE mov eax,dword ptr [strDest] ;eax里面存放strDest的地址
004113C1 mov dword ptr [address],eax ;adress里面存放eax,也就是strDest的地址
while ((*strDest++ = *strSrc++) != NULL);[/COLOR]
004113C4 mov eax,dword ptr [strDest] ;eax里面是strDest的地址
004113C7 mov ecx,dword ptr [strSrc] ;ecx里面是strSrc的地址
004113CA mov dl,byte ptr [ecx] ;把ecx指向的字节给dl,dl里面就是*strSrc
004113CC mov byte ptr [eax],dl ;dl放到eax指向的字节,那就是完成了*strDest=*strSrc
004113CE mov eax,dword ptr [strDest] ;eax里面是strDest的地址
004113D1 movsx ecx,byte ptr [eax] ;ecx里面是eax指向的字节,也就是*strDest了。
004113D4 mov edx,dword ptr [strDest] ;edx里面是strDest的地址
004113D7 add edx,1 ;edx+1,
004113DA mov dword ptr [strDest],edx ;edx传回到strDest,就是strDest++;
004113DD mov eax,dword ptr [strSrc] ;eax里面是strSrc的地址
004113E0 add eax,1 ;eax+1
004113E3 mov dword ptr [strSrc],eax ;eax传回到strSrc,就是strSrc++;
--------------------------------------------------------------------------------
004113E6 test ecx,ecx ;测试ecx,看看前面ecx里面放的是什么?(自加前的*strDest)
004113E8 je strcpy+56h (4113F6h) ;ecx=0,跳到后面13F6H(会给某个临时变量赋0)
004113EA mov dword ptr [ebp-0D0h],1 ;ecx!=0,给这个临时变量赋1
004113F4 jmp strcpy+60h (411400h) ;跳到后面1400H(看看这个临时变量是不是0)
004113F6 mov dword ptr [ebp-0D0h],0 ;前面(13E8)跳过来的,给这个临时变量赋0
00411400 cmp dword ptr [ebp-0D0h],0 ;前面(13F4)跳过来的,看看这个临时变量是不是0
00411407 je strcpy+6Bh (41140Bh) ;这个临时变量0,跳出循环,
00411409 jmp strcpy+24h (4113C4h) ;这个临时变量不是0,跳到上面while循环开始的地方。
--------------------------------------------------------------------------------
;这段好啰嗦,可能是debug版本的原因吧,Release版本应该不会这样吧!
return address;[/COLOR]
0041140B mov eax,dword ptr [address]
} |
|