GNU汇编程序 - 为什么没有' t(%rbp)覆盖堆栈上的帧指针?

时间:2018-01-30 12:20:28

标签: assembly disassembly

考虑以下反汇编代码:

_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函数的参数。

1 个答案:

答案 0 :(得分:2)

堆栈向下增长。 pushq的作用是:

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

因此,您推送的最后一个值(即%rbp的旧值)位于(%rsp),而来自%rsp的否定偏移的任何值都是“可用空间”。