Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么以下程序集的结果为0?_Assembly_Gdb_X86 64 - Fatal编程技术网

Assembly 为什么以下程序集的结果为0?

Assembly 为什么以下程序集的结果为0?,assembly,gdb,x86-64,Assembly,Gdb,X86 64,我不小心试图调用一个被破坏的类的虚拟函数。在使用GDB进行调试期间,我接触到了这个程序集(AT&T语法),我需要帮助理解它。以下结果是$rax=0。为什么? mov    -0x188(%rbp),%rax mov    (%rax),%rax add    $0x58,%rax mov    (%rax),%rax callq  *%rax 我尝试在gdb中运行以下命令: p $rbp gives 0x7f70277a2680 p $rbp - 0x88 gives 0x7f70277a25

我不小心试图调用一个被破坏的类的虚拟函数。在使用GDB进行调试期间,我接触到了这个程序集(AT&T语法),我需要帮助理解它。以下结果是
$rax=0
。为什么?

mov    -0x188(%rbp),%rax
mov    (%rax),%rax
add    $0x58,%rax
mov    (%rax),%rax
callq  *%rax
我尝试在gdb中运行以下命令:

p $rbp gives 0x7f70277a2680
p $rbp - 0x88 gives 0x7f70277a25f8
x 0x7f70277a25f8 gives 0x0185b4cb
p 0x0185b4cb + 0x58 gives 25539875
x 25539875 gives 0x8d481f76
如果
p$rax
为0,那么
x25539875
是否也应给出0?我错过了什么


编辑:

正如@prl所说,我意外地减少了0x88,而不是0x188。修复后一切正常,
p$rax
结果为0。多谢各位

p $rbp gives 0x7f70277a2680
p $rbp - 0x188 gives 0x7f70277a24f8
x/a 0x7f70277a24f8 gives 0x7ffc52e591d0
p 0x7ffc52e591d0 + 0x58 gives 140721699263016
x/a 140721699263016 gives 0

确保正在打印8个字节。最好使用
x/a
作为指针。
callq*%rax
是一种间接函数调用。函数调用修改包括RAX在内的调用阻塞寄存器。在调用之前,它当然可以使RAX=0独立于RBP或堆栈数据。我假设gdb在
调用时停止*%RAX
,因为空指针导致segfault。在gdb跟踪中,您打印了RBP-88而不是RBP-188。@prl捕获正确:)