2017-03-26 4 views
2

私はUbuntu 16.04でnasmを使用していますが、現在C memmove()の機能を再コードしようとしています。ここでasmでmemmoveを書き換えようとしています

は私のコードです:

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 

私はこの方法でそれを呼んでいる:

Saluton, SalSaluton 

しかし、私は得る::

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

の予想される出力がある

SalSaon, SalSalSaon 

何らかの理由で、4番目の文字になると、それは文字列rsiの先頭に戻ります。私の質問はなぜですか?私は間違って何をしていますか?

PS:3文字ごとに同じ問題が発生します。これは、先に進まなくても最初のものに戻る必要があります。

ありがとうございます。 memmovememcpy

差がmemcpyは少し高速であるが、それは先のメモリは、ソースメモリと重複することができないことである:Cで

答えて

1

は2つの機能があります。

実装したのはmemcpyで、memmoveではありません。

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

のコンテンツ"Hello world example"char配列を作成し、memcpy(&(array[6]), &(array[1]), 10);を実行してみましょう:

は何が起こっているかを見るためのがCでmemcpy(やないアセンブラで)を実装してみましょう。

初めてループが実行されると、文字「w」は「e」で上書きされ、永遠に消えます!

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

をところで:送信元アドレス、宛先アドレスの前または後で、送信元アドレスが宛先アドレスの前にある場合、それは後方ループをperfomするかどう

memmove機能は、しかし、チェックするのはなぜmovsb命令を使用しませんでしたか?

関連する問題