函数序言中的“mov rbp, rsp”

0 x86 assembly callstack stack-frame

push   rbp
mov    rbp, rsp
mov    DWORD PTR [rbp-0x4],edi
Run Code Online (Sandbox Code Playgroud)

在汇编函数序言中,不是push rbp已经将其值移到了rsp?为什么mov rbp, rsp指令再次移动相同的rsprbp?是必要的还是多余的?

med*_*le1 5

是不是push rbp已经将其值移至rsp

编号push rbp相当于:

sub rsp, 8                 ; but without setting FLAGS
mov [rsp], rbp
Run Code Online (Sandbox Code Playgroud)

不多也不少,就像推送任何其他寄存器一样(https://www.felixcloutier.com/x86/push)。这会存储rbp到 指向的内存rsp,但不会修改除 之外的寄存器rsp-=8。这不是enter指令


您可能已经知道这一点,但rbp它被用作帧指针mov rbp, rsp将之前的堆栈顶部保存到rbp,并且该顶部现在用作当前堆栈帧的底部。

但这会产生一个问题:如果rbp修改了,那么之前的堆栈帧怎么办?由于堆栈帧已被修改,因此在该函数返回后,rbp将处于错误的位置,并且事情会变得非常错误。

这就是push rbp出现的地方。它保存修改之前的值rbp,以便在函数返回之前,rbp可以将 的原始值弹出rbp,以便之前的堆栈帧保持正常。

(或者换句话说,rbp它是调用保留的,因此我们需要保存/恢复它,作为将其设置为堆栈帧的帧指针的一部分。)