찾다

 >  Q&A  >  본문

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

push %ebp
movl %esp, %ebp

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

天蓬老师天蓬老师2804일 전1218

모든 응답(3)나는 대답할 것이다

  • 迷茫

    迷茫2017-04-17 13:09:07

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

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:09:07

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

    회신하다
    0
  • 阿神

    阿神2017-04-17 13:09:07

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

    회신하다
    0
  • 취소회신하다