movq(%rsi),%r​​cx有人能告诉我这是什么意思吗?

时间:2014-08-20 05:57:03

标签: linux assembly linux-kernel

这是../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):

非常感谢您的所有时间。

1 个答案:

答案 0 :(得分:2)

GDB正在为您提供关键信息。源地址0x9超出范围,您要告知0x9实际上是要复制的值。因此,您不会向memcpy传递有效的源地址,而是传递值。

也许您传递的是变量x而不是地址&x

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

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