仅在Win32上使用,Win64上不允许内嵌汇编= =

 

__declspec(naked)
void* __stdcall __memcpy (
    __in void* Dest,            // ebp+0x08
    __in const void* Src,       // ebp+0x0C
    __in unsigned int Count     // ebp+0x10
    )
{
    __asm {
        push ebp
        mov ebp, esp
        push edi
        push esi

        mov edi, Dest           // edi = Dest
        mov esi, Src            // esi = Src 
        mov ecx, Count          // ecx = Count

        mov eax, esi            // eax = Src;
        add eax, ecx            // eax = eax + ecx == Src + Count;
        mov edx, [eax-4]        // edx = [eax-4] == *(int32*)(Src + Count - 4)
        mov eax, edi            // eax = Dest;
        add eax, ecx            // eax = eax + ecx == Dest + Count;
        mov [eax-4], edx        // [eax-4] == *(int32*)(Dest + Count - 4) 
                                //        = edx == *(int32*)(Src + Count - 4);

        shr ecx, 2              // ecx = ecx >> 2 == Count >> 2;
        rep movsd

        mov eax, Dest
        pop esi
        pop edi
        pop ebp
        retn 0x0C
    };
}