memmove函式彙編實現
阿新 • • 發佈:2018-11-08
參考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位元組對齊)