搜尋

首頁  >  問答  >  主體

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

push %ebp
movl %esp, %ebp

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

天蓬老师天蓬老师2806 天前1225

全部回覆(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
  • 取消回覆