GNU 汇编程序 - 为什么 -4(%rbp) 不覆盖堆栈上的帧指针?

GNU Assembler - why doesn't -4(%rbp) override frame pointer on stack?

考虑以下反汇编代码:

_sum:
0000000100000f60    pushq   %rbp
0000000100000f61    movq    %rsp, %rbp
0000000100000f64    movl    %edi, -0x4(%rbp)
0000000100000f67    movl    %esi, -0x8(%rbp)

据我所知,%rbp 是一个 64 位寄存器,所以这意味着 pushq %rpb 在堆栈上分配了 8 个字节。如果是这样,为什么 movl %edi, -0x4(%rbp) 有效?我相信它会覆盖已保存的 4 个字节的 %rbp,稍后必须从程序中将其用于 return。 %edi%esi 是传递给 sum 函数的参数。

堆栈向下增长。 pushq 所做的是:

RSP  ← RSP – 8;
Memory[SS:RSP]  ← SRC; (* push quadword *)

因此,您推送的最后一个值(即 %rbp 的旧值)位于 (%rsp),而与 %rsp 的负偏移量为 "free space"。