考虑以下反汇编代码:
_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)
有效?我相信它会覆盖已保存的%rbp
的4个字节,这些字节必须用于稍后从程序返回。 %edi
和%esi
是传递给sum
函数的参数。
答案 0 :(得分:2)
堆栈向下增长。 pushq
的作用是:
RSP ← RSP – 8;
Memory[SS:RSP] ← SRC; (* push quadword *)
因此,您推送的最后一个值(即%rbp
的旧值)位于(%rsp)
,而来自%rsp
的否定偏移的任何值都是“可用空间”。