已知%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