Ok, updated version:
void*
memmove(void *vdst, void *vsrc, int n)
{
char *dst, *src;
dst = vdst;
src = vsrc;
if(vdst > vsrc) {
dst = vdst + n;
src = vsrc + n;
while(n-- > 0)
*--dst = *--src;
}
else if(vdst < vsrc)
while(n-- > 0)
*dst++ == *src++;
return vdst;
}
Does this solve the bugs?