gpt4 book ai didi

performance - EBP帧指针寄存器的用途是什么?

转载 作者:行者123 更新时间:2023-12-03 05:03:18 25 4
gpt4 key购买 nike

我是汇编语言的初学者,并且注意到编译器发出的 x86 代码通常会保留帧指针,即使在发布/优化模式下,当它可以使用 EBP 寄存器进行其他操作时也是如此.

我理解为什么帧指针可能使代码更易于调试,并且如果在函数内调用 alloca() ,则可能是必需的。然而,x86 的寄存器非常少,并且在一个就足够的情况下使用其中两个来保存堆栈帧的位置对我来说没有意义。为什么即使在优化/发布版本中省略帧指针也被认为是一个坏主意?

最佳答案

帧指针是一个引用指针,允许调试器通过单个常量偏移知道局部变量或参数的位置。尽管 ESP 的值在执行过程中发生变化,但 EBP 保持不变,使得可以以相同的偏移量到达相同的变量(例如第一个参数将始终为 EBP+8,而 ESP 偏移量可能会发生显着变化,因为您将插入/弹出东西)

为什么编译器不丢弃帧指针?因为使用帧指针,调试器可以找出局部变量和参数使用符号表的位置,因为它们保证位于 EBP 的恒定偏移处。否则,没有一种简单的方法可以确定局部变量在代码中任何位置的位置。

正如 Greg 提到的,它还有助于调试器的堆栈展开,因为 EBP 提供了堆栈帧的反向链接列表,因此让调试器可以计算出函数的堆栈帧(局部变量 + 参数)的大小。

大多数编译器都提供了省略帧指针的选项,尽管它使调试变得非常困难。该选项永远不应该在全局使用,即使在发布代码中也是如此。您不知道何时需要调试用户的崩溃。

关于performance - EBP帧指针寄存器的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/579262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com