我们知道ESP和EBP都是x86的CPU寄存器,在汇编中经常会用到,这两个比较容易搞混,我之前用了下,一段时间没用又记不清两者的区别和用法了,故写一篇文章记录下。

ESP (Extended Stack Pointer):
ESP 寄存器是堆栈指针寄存器,它总是指向程序栈顶部的地址。在函数调用和返回过程中,ESP 用于跟踪栈上的最新数据。当数据被推送到栈上时,ESP 的值减小(因为栈在内存中向下增长),而当数据被弹出栈时,ESP 的值增加。

EBP (Extended Base Pointer):
EBP 寄存器是基指针寄存器,它通常用于在函数调用期间作为参考点,来访问函数参数和局部变量。一般在函数的开始处,会将当前的 ESP 值复制到 EBP 中,这样无论栈指针如何移动,函数内部都可以通过 EBP 寄存器以一个固定的偏移量来访问其参数和局部变量。

简单来说ESP就是指向栈顶,EBP指向基址。ESP往栈底方向移动是用加偏移而不是减,栈底是高位地址(如上图),如[ESP+4], 4是偏移量。

以下是一个简单的例子,展示了在 x86 汇编语言中如何使用 ESP 和 EBP 寄存器:

push ebp            ; 将当前函数的EBP值保存到栈上
mov ebp, esp        ; 将ESP的值复制到EBP,设置新的基点
sub esp, 32         ; 在栈上为局部变量分配32字节的空间

; 在这里可以通过EBP加上偏移量来访问函数的参数和局部变量

mov esp, ebp        ; 恢复ESP的值,撤销局部变量的空间
pop ebp             ; 恢复调用函数的EBP值
ret                 ; 返回到调用函数的下一条指令