memmove函数汇编实现

在这里插入图片描述
参考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字节对齐)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u010373790/article/details/83821867