已知%rsp指向堆栈帧的顶部,并且指向堆栈帧的基址。然后,我不明白为什么RBP%为0x0在这段代码:为什么%rbp指向没有?
(gdb) x/4xg $rsp
0x7fffffffe170: 0x00000000004000dc 0x0000000000000010
0x7fffffffe180: 0x0000000000000001 0x00007fffffffe487
(gdb) disas HelloWorldProc
Dump of assembler code for function HelloWorldProc:
=> 0x00000000004000b0 <+0>: push %rbp
0x00000000004000b1 <+1>: mov %rsp,%rbp
0x00000000004000b4 <+4>: mov $0x1,%eax
0x00000000004000b9 <+9>: mov $0x1,%edi
0x00000000004000be <+14>: movabs $0x6000ec,%rsi
0x00000000004000c8 <+24>: mov $0xd,%edx
0x00000000004000cd <+29>: syscall
0x00000000004000cf <+31>: leaveq
0x00000000004000d0 <+32>: retq
End of assembler dump.
(gdb) x/xg $rbp
0x0: Cannot access memory at address 0x0
,为什么它很“节约”(推)%RBP堆栈,如果它指向什么?
分享您的原代码 –
其实,RSP指向栈帧的顶部,但程序框架和RBP指向程序框架顶部的底部。 Linux下的GDB开始将除RSP之外的所有寄存器设置为NULL的应用程序。跟踪到4000B4然后'x/xg $ rsp'将会工作。 –
@Shift_Left你是对的。但要成为事实,我无法理解这种行为的原因。如果系统需要知道堆栈的范围/大小,那么%rbp从零开始的可能性如何?你不同意在程序开始时不知道堆栈帧的起始位置吗? – alacerda