尝试在 asm 中重新编码 memmove
Trying to recode memmove in asm
我在 Ubuntu 16.04 上使用 nasm,我目前正在尝试重新编码 C 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
我是这样称呼它的:
char *str = strdup("Salutation");
printf("%s, %s\n", (char *)memmove(str + 3, str, 5), str);
预期输出为:
Saluton, SalSaluton
但我得到:
SalSaon, SalSalSaon
出于某些原因,当我到达第四个字符时,它会返回到我的字符串 rsi
的开头。我的问题是为什么?我做错了什么?
PS : 每隔三个字符就会出现同样的问题,好像无法继续下去,不得不回到第一个。
提前致谢。
在 C 中有两个函数:memmove
和 memcpy
区别在于memcpy
速度稍快但不允许目标内存与源内存重叠。
你实现的是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" 覆盖并永远消失!
然而,memmove
函数将检查源地址是在目标地址之前还是之后,如果源地址在目标地址之前,它将向后执行循环:
for(i=count-1; i>=0; i--)
顺便说一句:你为什么不使用 movsb
指令?
我在 Ubuntu 16.04 上使用 nasm,我目前正在尝试重新编码 C 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
我是这样称呼它的:
char *str = strdup("Salutation");
printf("%s, %s\n", (char *)memmove(str + 3, str, 5), str);
预期输出为:
Saluton, SalSaluton
但我得到:
SalSaon, SalSalSaon
出于某些原因,当我到达第四个字符时,它会返回到我的字符串 rsi
的开头。我的问题是为什么?我做错了什么?
PS : 每隔三个字符就会出现同样的问题,好像无法继续下去,不得不回到第一个。
提前致谢。
在 C 中有两个函数:memmove
和 memcpy
区别在于memcpy
速度稍快但不允许目标内存与源内存重叠。
你实现的是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" 覆盖并永远消失!
然而,memmove
函数将检查源地址是在目标地址之前还是之后,如果源地址在目标地址之前,它将向后执行循环:
for(i=count-1; i>=0; i--)
顺便说一句:你为什么不使用 movsb
指令?