浅析栈指针ESP和帧指针EBP

ESPEBP是刚接触栈的时候就碰到的两个指针。对这两个我一直是处于一知半解状态。

错误认知:ESP是指向栈顶指针,EBP是指向栈底指针。

我这么认为已经很长时间了,而且自己觉得没问题。
直到今天看英文版的书,遇到mov eax,[ebp+10h]
我仔细想了一下,栈内肯定是栈底地址最大,要是ebp指向栈底,那么ebp+10h不是超出栈的地址范围了???
这一度让我的认知出现混乱。
这个就要涉及到栈的结构了,一直以为栈就是一个数据段,esp指头,ebp指尾。这里涉及到栈帧的概念,栈里面被分为一个个栈帧。
借用一个很火的网图
而ebp和esp的定义:

(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

ESP和EBP都是指向最上面一个栈帧的。ESP指向这个栈帧的栈顶,EBP指向这个栈帧的底部。(这么说来ESP指向栈顶地址也是正确的,但EBP指向栈底地址就有问题了。)
所以这里的ebp+10h,就指向了调用者的帧。

每个栈帧都有首地址,而ebp就是指向栈帧的首地址(注意,首地址和栈顶不同),函数层层调用的时候,刚开始ebp是存了父函数的首地址,当父函数调用子函数后,ebp则要存子函数的栈帧首地址,而子函数的栈帧首地址内可以存一个值,这个值还是父函数的栈帧首地址,这样,每当子函数调用完,就能回到父函数内,层层递推,最终回到main()函数,函数调用的过程由此实现。

关于ebp的详解:

%ebp叫帧指针,

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值