1. 程式人生 > >memmove函式彙編實現

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位元組對齊)
在這裡插入圖片描述