我目前正在研究调用函数时堆栈如何变化。当我使用gdb
研究main
函数时,我注意到将具有值rbx
的{{1}}推入堆栈时,0x0
仅在rsp
时减小。
所以看来0x2
与push rbx
相同,为什么?
代码:
push bx
在一开始,堆栈就像:
0x800060a <main> push %rbp
0x800060b <main+1> mov %rsp,%rbp
0x800060e <main+4> push %rbx
0x800060f <main+5> sub $0x10,%rsp
0x8000613 <main+9> mov $0x5,%ebx
0x8000618 <main+14> movl $0x64,-0x10(%rbp)
0x800061f <main+21> mov -0x10(%rbp),%eax
0x8000622 <main+24> add %ebx,%eax
0x8000624 <main+26> mov %eax,%edi
0x8000626 <main+28> callq 0x80005fa <foo>
0x800062b <main+33> mov %eax,-0xc(%rbp)
0x800062e <main+36> mov -0xc(%rbp),%eax
0x8000631 <main+39> add $0x10,%rsp
0x8000635 <main+43> pop %rbx
0x8000636 <main+44> pop %rbp
0x8000637 <main+45> retq
然后在0x8000640 | stack frame ($rbp)
........ |
........ | ........ (stack)
........ |
0x7ffffffee270 | stack top ($rsp)
和push %rbp
之后,堆栈就像:
mov %rsp,%rbp
但是,在0x8000640 | stack frame (start)
........ |
........ | ........ (stack)
........ |
0x7ffffffee260 | 0x8000640 rbp rsp
和sub $0x10,%rsp
之后是合理的:
push %rbx
为什么(gdb) p/x $rbx
$1 = 0x0
(gdb) p/x $rsp
$2 = 0x7ffffffee248
不是rsp
?