2017-03-26 6 views
2

저는 우분투 16.04에서 nasm을 사용하고 있으며 현재 C memmove() 기능을 재 코딩하려고합니다.asm에서 memmove를 recode하려고 시도했습니다.

Saluton, SalSaluton 

하지만 얻을 :

char *str = strdup("Salutation"); 
printf("%s, %s\n", (char *)memmove(str + 3, str, 5), str); 

예상 출력은 다음과 같습니다

SalSaon, SalSalSaon 
나는 이런 식으로 전화 드렸습니다

BITS 64 

global memmove 

memmove: 
     push rbp 
     mov rbp, rsp 
     xor rcx, rcx 

while: 
     cmp rcx, rdx 
     je end 
     mov r10b, byte [rsi + rcx] 
     mov byte [rdi + rcx], r10b 
     inc rcx 
     jmp while 

end: 
     mov rax, rdi 
     leave 
     ret 

: 여기

내 코드입니다

몇 가지 이유로 네 번째 문자를 얻으면 내 문자열 rsi의 시작 부분으로 돌아갑니다. 내 질문은 왜? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

추신 : 3 자마다 동일한 문제가 발생합니다 (예 : 더 이상 갈 수없는 경우). 첫 번째 문제로 돌아 가야하는 것처럼 문제가 발생합니다.

미리 감사드립니다. memmovememcpy

차이가 memcpy 약간 빠르다하지만 대상 메모리 소스 메모리를 중첩하는 것을 허용하지 않는다는 점이다 : C에서

답변

1

두 가지 기능이있다.

구현 한 내용은 memcpy 아니요, memmove이 아닙니다!

는 이제 무슨 일이 일어나고 있는지 볼 (어셈블러에서가 아니라) C에서 memcpy을 구현하자

for(i=0; i<count; i++) 
{ 
    destination[i]=source[i]; 
} 

가의 콘텐츠 "Hello world example"char 배열을 만들고 memcpy(&(array[6]), &(array[1]), 10);을 수행 할 수 있습니다.

루프가 처음 실행될 때 문자 "w"는 "e"로 덮어 쓰여지고 영원히 사라질 것입니다! 그런데

for(i=count-1; i>=0; i--) 

: 소스 주소가 이전 또는 목적지 주소 후 소스 주소가 목적지 주소 이전 인 경우 거꾸로 루프를 perfom 할 경우

memmove 기능은 그러나 확인합니다 왜 movsb 명령어를 사용하지 않으셨습니까?