Assembly 为什么以下程序集的结果为0?
我不小心试图调用一个被破坏的类的虚拟函数。在使用GDB进行调试期间,我接触到了这个程序集(AT&T语法),我需要帮助理解它。以下结果是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
$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捕获正确:)