为什么`push%rbx`只将`rsp`减少0x2?

时间:2019-08-17 14:39:20

标签: assembly x86-64

我目前正在研究调用函数时堆栈如何变化。当我使用gdb研究main函数时,我注意到将具有值rbx的{​​{1}}推入堆栈时,0x0仅在rsp时减小。

所以看来0x2push 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

0 个答案:

没有答案