【问题标题】:"mov rbp, rsp" in function prologue函数序言中的“mov rbp, rsp”
【发布时间】:2021-07-30 15:26:56
【问题描述】:
push   rbp
mov    rbp, rsp
mov    DWORD PTR [rbp-0x4],edi

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

【问题讨论】:

  • 这不是push 所做的。再次阅读它的描述。它将值从rbp 移动到rsp 指向的内存位置(在减8 之后)。
  • push rbprsp 减8,然后将rbpprior 值写入rsp 指向的内存 . mov rbp, rsp 然后将新的rsp 值加载到rbp 寄存器中。

标签: assembly x86 callstack stack-frame


【解决方案1】:

push rbp 不是已经将它的值移动到rsp了吗?

没有。 push rbp 相当于:

sub rsp, 8                 ; but without setting FLAGS
mov [rsp], rbp

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


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

但这会产生一个问题:如果rbp 已被修改,那么之前的堆栈帧呢?由于栈帧已经被修改,所以这个函数返回后,rbp 会在错误的位置,事情会很糟糕。

这就是push rbp的来源。它在修改之前保存rbp的值,以便在函数返回之前,rbp的原始值可以直接弹回rbp,所以前面的堆栈框架保持正常。

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

【讨论】:

    【解决方案2】:

    mov rbp, rsp 将 rsp 中的当前值移动到 rbp 中。

    认为: 您想保存最后一个堆栈帧并构建另一个堆栈帧。

    intel(上面的代码)和at&t语法也有区别。

    英特尔: mov dest, source

    【讨论】:

    • 这些事情都是真的,但问题的措辞清楚地表明他们知道mov rbp, rsp 做了什么。他们对push 感到困惑。
    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 2021-04-18
    • 2012-12-27
    • 2018-02-02
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多