gpt4 book ai didi

linux - movq (%rsi), %rcx 谁能告诉我这是什么意思?

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

这是 ../sysdeps/x86_64/memcpy.S 中的一行,在这行之后我遇到了 VM 崩溃,所以我需要知道发生了什么。基本上我知道它类似于将 rsi 复制到 rcx。但这是否意味着 rsi 和 rcx 本身应该都是有效地址?因为当我输入“信息寄存器”时,我得到:

rcx            0xfa7e828    262662184
rsi 0x9 9

当我使用“x/s”查看地址中的内容时,我得到:

(gdb) x/s 0x7fb47787e820
0x7fb47787e820: ""
(gdb) x/s 0xfa7e828
0xfa7e828: <Address 0xfa7e828 out of bounds>
(gdb) p $rsi
$2 = 9
(gdb) x/s 0x9
0x9: <Address 0x9 out of bounds>

实际上“0x09”是我想复制到某个地方的值,而不是值的地址。那么是不是因为这行代码将“0x09”当作某个地址,因此出现了以下错误?

(gdb) n

Program received signal SIGSEGV, Segmentation fault.
memcpy () at ../sysdeps/x86_64/memcpy.S:102
102 movq (%rsi), %rcx

如果有帮助,该行的回溯和代码是:

(gdb) bt
#0 memcpy () at ../sysdeps/x86_64/memcpy.S:102
#1 0x00007fb484688f68 in ?? ()
#2 0x00007fb4830399d1 in start_thread (arg=0x7fb464af8700) at pthread_create.c:301
#3 0x00007fb482d86b7d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:115
(gdb) l
97
98 L(1c): /* 8-byte once */
99 testb $8, %dl
100 jz L(1d)
101
102 movq (%rsi), %rcx
103 movq %rcx, (%rdi)
104
105 addq $8, %rsi
106 addq $8, %rdi
(gdb)
107
108 .p2align 4,, 4
109
110 L(1d): /* 16-byte loop */
111 andl $0xf0, %edx
112 jz L(exit)
113
114 .p2align 4
115
116 L(1loop):

非常感谢您的宝贵时间。

最佳答案

GDB 为您提供关键信息。源地址 0x9 越界,你告诉 0x9 实际上是要复制的值。因此,您没有向 memcpy 传递有效的源地址,而是传递值。

也许你正在传递一个变量x而不是它的地址&x:

...
x = 9;
memcpy(destination_address, x, N); //<-- should be &x

destination_address 也必须考虑同样的问题。如果它是一个变量,则使用 & 运算符取消引用。如果是指针,则按原样传递。

关于linux - movq (%rsi), %rcx 谁能告诉我这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25397638/

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