【问题标题】:Why is Saved Frame Pointer present in a stack frame?为什么堆栈帧中存在已保存的帧指针?
【发布时间】:2017-07-14 22:01:19
【问题描述】:

我读到 SFP 用于将 EBP 恢复到之前的值。为什么EBP需要恢复到初始值?

【问题讨论】:

  • C 语言甚至没有提到堆栈,也没有提到特定的寄存器。
  • "EBP 寄存器 — 有时称为帧指针 (FP) 或本地基址 (LB) 指针 — 用于引用当前堆栈帧中的局部函数变量。每个堆栈帧包含参数函数、它的局部变量和两个将事物恢复原状所必需的指针:保存的帧指针 (SFP) 和返回地址。SFP 用于恢复 EBP恢复到之前的值,返回地址用于将 EIP 恢复到函数调用后找到的下一条指令。 " @Olaf
  • 请提供对定义此寄存器并要求 C 实现完全使用堆栈的标准的参考。阅读How to Ask 并使用 [ŧour] 查看标签的用途以及问题应包含的内容。
  • 因为按照惯例调用者正在使用它(或者我们假设是这种情况)并希望它在整个调用过程中被保留。

标签: cpu-registers machine-code stack-pointer


【解决方案1】:

为什么EBP需要回到它的初始值?

当进行函数调用时,编译器通常作为函数体的第一件事,将当前的 EBP 值压入堆栈并将 EBP(基指针/帧指针)设置为当前的 ESP(堆栈指针, 总是指向栈顶)。然后使用 EBP 访问函数的局部变量和参数。

当函数返回 o 时,EBP 的值被恢复,它可以服务于前一个函数的函数调用。

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2014-10-26
    相关资源
    最近更新 更多