gcc编译后每个函数开始的 “push %ebp; movl %esp, %ebp” 是什么意思

发布于 2022-09-01 21:44:46 字数 82 浏览 12 评论 0

push %ebp
movl %esp, %ebp

是什么意思?有什么作用?为什么要这样做???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

怎言笑 2022-09-08 21:44:46

ebp是帧指针,esp是栈指针。这两行代码是保存旧的帧,创建新的栈帧。汇编里的过程调用需要这个动作

一个人的夜不怕黑 2022-09-08 21:44:46

创建stack frame,可以优化掉。保留这个主要方便调试,可以追溯函数调用链。
unsigned long *p=ebp;
*(p+1)就是调用函数的返回地址。
p=*p,就是上一级函数的帧
*(p+1)就是上一级函数的调用函数的返回地址
可以一直通过这个追溯到最上面的那个函数。

尝蛊 2022-09-08 21:44:46

这个和函数栈帧有关。
过程开始时,都会为当前这个过程建立一个栈帧,机器是用栈来传递过程参数,存储返回信息的。%ebp是帧指针,%esp是栈指针。你提的这两句就是建栈的语句。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文