参考memmove源码
void* memmove(void* dst,const void* src,size_t count)
{
void* ret = dst;
//dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容
if (dst <= src || (char*)dst >= ((char*)src + count))
{
//从前往后复制,则不会出现覆盖src中没有复制的内容
while(count--)
{
*(char*)dst = *(char*)src; //char类型指针,表示一个字节一个字节的复制
dst = (char*)dst + 1; //移动一个字节
src = (char*)src + 1;
}
}
else
{
//从后往前复制,则不会出现覆盖src中没有复制的内容
dst = (char*)dst + count - 1;//移动到末尾
src = (char*)src + count - 1;
while(count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1; //移动一个字节
src = (char*)src - 1;
}
}
//返回dst的头指针,还方便左值操作。
//如:ptstr = memmove(ptstr,src,count); cout << memmove(ptstr,src,count);
return ret;
}
汇编程序段:
AREA MEMM,CODE,READONLY
EXPORT mem
IMPORT compare
mem
mov r6,lr
mov r3,r0
mov r5,r1
bl compare
cmp r0,#0
mov r0,r3;
bne M1
beq M2
M1
L1
subs r2,r2,#4 ;从前向后复制
ldrpl r4,[r0],#4
strpl r4,[r1],#4
bgt L1
L2
subs r2,r2,#1
ldrplb r4,[r0],#1
strplb r4,[r1],#1
bgt L2
b out
M2
sub r2,r2,#1
add r0,r0,r2
add r1,r1,r2
add r2,r2,#1
L3
subs r2,r2,#4 ;从后往前复制
ldrpl r4,[r0],#-4
strpl r4,[r1],#-4
bgt L3
L4
subs r2,r2,#1
ldrplb r4,[r0],#-1
strplb r4,[r1],#-1
bgt L4
b out
out
mov r0,r5
mov pc,r6
end
c程序段:
#include <stdio.h>
extern void* mem(char*a,char*b,int len);
int compare(void* dst,void* src);
//extern int add(int a,int b);
int main()
{
char c[5]="cba";
char a[5]="abcd";
mem(a,c,5);
printf("%s",c);
return 0;
}
int compare(void* dst,void* src)
{
if(dst<=src) return 1;
else return 0;
}
运行测试:
实现了memmove函数功能(快速移动,非4字节对齐)