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"。
考虑以下反汇编代码:
_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"。