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指令再次移动相同的rsp值rbp?是必要的还是多余的?
是不是
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它是调用保留的,因此我们需要保存/恢复它,作为将其设置为堆栈帧的帧指针的一部分。)