私は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文字ごとに同じ問題が発生します。これは、先に進まなくても最初のものに戻る必要があります。
ありがとうございます。 memmove
とmemcpy
差がmemcpy
は少し高速であるが、それは先のメモリは、ソースメモリと重複することができないことである:Cで