我在 Ubuntu 16.04 上使用 nasm,目前正在尝试重新编码 Cmemmove()
函数。
这是我的代码:
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
我这样称呼它:
char *str = strdup("Salutation");
printf("%s, %s\n", (char *)memmove(str + 3, str, 5), str);
预期输出为:
Saluton, SalSaluton
但我得到:
SalSaon, SalSalSaon
由于某些原因,当我到达第四个字符时,它会回到我的字符串的开头rsi
。我的问题是为什么?我究竟做错了什么?
PS:同样的问题每三个字符发生一次,就像它无法继续前进,不得不回到第一个。
提前致谢。