assembly - 什么是 ESP 和 EBP 寄存器?

标签 assembly x86 callstack stack-frame

我发现 ESP 寄存器是当前堆栈指针,而 EBP 是当前堆栈帧的基指针。但是,我不明白这些定义(我刚刚开始学习如何在汇编程序中编码)。

我的理解是 ESP 指向堆栈本身,而 EBP 指向堆栈 1 顶部的任何内容。但这些只是我的猜测,它们很可能是不正确的。否则,下面这样的语句是什么意思?

MOV EBP, ESP    

脚注 1:编者注:是的,这是不正确的。在标准术语中,“栈顶”是 ESP 指向的地方,即使它是栈帧中的最低地址。类似于向上增长的堆栈数据结构,即使 x86 上的调用堆栈(如大多数 ISA)向下增长。

最佳答案

esp 是堆栈指针,ebp 是/曾经是堆栈帧,因此当您进入函数时,ebp 可以在该点获得 esp 的副本,在此之前堆栈上的所有内容、返回地址、传入的参数等该函数的全局变量(局部变量)现在将在函数的持续时间内与堆栈帧指针保持静态距离。 esp 现在可以根据编译器的需要自由地四处游荡,并且可以在嵌套到其他函数时使用(每个函数都需要自然地保留 ebp)。

这是一种管理堆栈的懒惰方式。使编译器调试更容易,更容易理解编译器生成的代码,但会烧掉一个可能是通用的寄存器。

关于assembly - 什么是 ESP 和 EBP 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718397/

相关文章:

swift - Xcode 是否为 Swift 文件生成汇编代码?

linux - 多级页表概念

delphi - 如何在没有有用的调用堆栈的情况下调试难以重现的崩溃?

c# - Mono:如何(重新)抛出保留原始堆栈跟踪信息和收集本地数据的异常

c - 汇编程序和 C 编程 linux -m32(来自汇编程序寄存器的字符字节)

c - 将 128 位寄存器从汇编传递给 C 函数

performance - rdpmc : surprising behavior

windows - 在ESP以下书写是否有效?

c - 为什么 %esp 会被不明确地更改?

assembly - 重复/广播一个字节到整数寄存器的每个位置