memcpy和memmove函数的实现

memcpy

代码:
;***
;memcpy.asm - contains memcpy and memmove routines
;
; Copyright (c) 1986-1997, Microsoft Corporation. All right reserved.
;
;Purpose:
; memcpy() copies a source memory buffer to a destination buffer.
; Overlapping buffers are not treated specially, so propogation may occur.
; memmove() copies a source memory buffer to a destination buffer.
; Overlapping buffers are treated specially, to avoid propogation.
;
;*******************************************************************************
;***
;memcpy - Copy source buffer to destination buffer
;
;Purpose:
; memcpy() copies a source memory buffer to a destination memory buffer.
; This routine does NOT recognize overlapping buffers, and thus can lead
; to propogation.
; For cases where propogation must be avoided, memmove() must be used.
;
; Algorithm:

void* memcpy(void* dest, void* source, size_t count)

{

void* ret = dest;

//copy from lower address to higher address

while (count--)

*dest++ = *source;

return ret;

}

memmove

memmove - Copy source buffer to destination buffer
;
;Purpose:
; memmove() copies a source memory buffer to a destination memory buffer.
; This routine recognize overlapping buffers to avoid propogation.
; For cases where propogation is not a problem, memcpy() can be used.
;
; Algorithm:

void* memmove(void* dest, void* source, size_t count)

{

void* ret = dest;

if (dest <= source || dest >= (source + count))

{

//Non-Overlapping Buffers
//copy from lower addresses to higher addresses

while (count --)

*dest++ = *source++;

}

else

{

//Overlapping Buffers
//copy from higher addresses to lower addresses

dest += count - 1;

source += count - 1;

while (count--)

*dest-- = *source--;l

}

return ret;

}

另一种实现:

void*mymemcpy(void*dest,constvoid*src,size_tcount)
{
char*d=(char*)dest;
constchar*s=(constchar*)src;
//intn=(count+7)/8;//count>0assumed
intn=count>>3;
switch(count&7)
{
do{*d++=*s++;
case7:*d++=*s++;
case6:*d++=*s++;
case5:*d++=*s++;
case4:*d++=*s++;
case3:*d++=*s++;
case2:*d++=*s++;
case1:*d++=*s++;
case0}//while(--n>0);
while(n-->0)
}

returndest;
}

你可能感兴趣的:(move)