代码之家  ›  专栏  ›  技术社区  ›  Engineer999

在使用堆栈方面,为什么我们需要一个基指针和一个堆栈指针

  •  1
  • Engineer999  · 技术社区  · 6 年前

    当我们调用一个函数时,EBP的当前值将被放在堆栈上,然后EBP得到当前的ESP值。

    然后,返回值、函数参数和函数局部变量的占位符将放置在堆栈上,堆栈指针ESP值将减小(或增大)以指向放置在堆栈上的最后一个占位符之后。

    现在,EBP指向当前堆栈帧的开头,ESP指向堆栈帧的结尾。

    ESP不应该从所有局部变量等都有一个占位符开始改变,还是应该改变?

    0 回复  |  直到 6 年前
        1
  •  2
  •   dash-o    6 年前

    关于调试器/运行时工具的旁注:

    使用EBP使调试器(和其他运行时工具)更容易“遍历堆栈”。工具可以在运行时检查堆栈,并且在不知道任何关于当前程序堆栈的信息(例如,有多少项被推入eac帧)的情况下,可以将堆栈一直移动到“main”。

        2
  •  2
  •   dash-o    6 年前

    从技术上讲,跟踪堆栈中存储了多少局部变量和临时变量是可能的(但有时很难),这样就可以在没有EBP的情况下访问函数输入和局部变量。

    考虑以下“C”代码;

    int func(int arg) {
       int result ;
       double x[arg+5] ;
       // Do something with x, calculate result
       return result ;
    } ;
    

    总之,将EBP寄存器提交到单个函数(而不是将其用作通用寄存器)的决定是性能、简单性、代码大小和其他因素之间的权衡。实践经验表明,利大于弊。