gpt4 book ai didi

c - 汇编中的内存移动

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:04 24 4
gpt4 key购买 nike

我正在尝试将此 Memmove C 代码放入汇编中,但没有得到预期的结果。

我在 xubuntu 上使用 x86-64 程序集,调试了 2 小时后,我看不出哪里错了。

C 内存移动代码:

#include <stdio.h> 

extern void * memmove(void *dest, void *src, size_t n);

int main () {
char str1[] = "Geeks"; // Array of size 6
char str2[] = "Quiz"; // Array of size 5

puts("str1 before memmove ");
puts(str1);

/* Copies contents of str2 to sr1 */
memmove(str1, str2, sizeof(str2));

puts("\nstr1 after memmove ");
puts(str1);

return 0;
}
/*

void * memmove(void *dest, void *src, size_t n) {

char *d = (char *) dest;
char *s = (char *) src;

if(s == d)
return dest;

if(s < d) {
//copy from back
s=s+n-1;
d=d+n-1;
while(n--) {
*d-- = *s--;
}
}
else {
//copy from front
while(n--)
*d++ = *s++;
}
return dest;
} */

汇编代码:

.globl memmove

# RDI = dest
# RSI = src
# RDX = n

# R8 = d
# R9 = s

memmove:
mov %rdi, %r8 # d = dest
mov %rsi, %r9 # s = src
jmp if_equal

if_equal:
cmp %r8, %r9 # s == d
jz retDest
ja else # s > d
jb if_s_minor # s < d

if_s_minor:
add %rdx, %r9 # s = s + n
sub $1, %r9 # s = s - 1

add %rdx, %r8 # d = d + n
sub $1, %r8 # d = d - 1

jmp while1

while1:
cmp $0, %rdx # n > 0 ?
jna retDest # if n <= 0 go to retDest
sub $1, %rdx # n--

movb (%rsi), %cl # *dst-- = *src--
movb %cl, (%rdi)

leaq -1(%r8), %r8 # *d--
leaq -1(%r9), %r9 # *s--
jmp while1

else:
jmp while2

while2:
cmp $0, %rdx # n > 0 ?
jna retDest
sub $1, %rdx # n--

movb (%rsi), %cl # *dst = *src
movb %cl, (%rdi)

leaq 1(%r8), %r8 # *d++
leaq 1(%r9), %r9 # *s++
jmp while2

retDest:
mov %rdi, %rax
ret

.end

它应该在第二次打印时显示“测验”,但它显示了这个:

内存移动之前的 str1极客

内存移动后的str1奇客

最佳答案

movb    (%rsi), %cl     # *dst = *src
movb %cl, (%rdi)
leaq 1(%r8), %r8 # *d++
leaq 1(%r9), %r9 # *s++
jmp while2

这里的问题是您的代码更改了 %r8%r9 寄存器,但是 %rdi%rsi 实际移动中使用的寄存器保持不变,因此一次又一次地重复复制相同的字节!

while1 代码中当然存在同样的问题。

关于c - 汇编中的内存移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53581541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com