2016-01-23 34 views
1

我最近研究了x86程序集,並且不明白爲什麼我們必須要做push ebp 當輸入新函數時。爲什麼在轉到下一個堆棧幀時存儲舊幀指針

從調查中,我可以看到ebp的需求是因爲它可以輕鬆訪問函數調用的參數和這個新被調用者中的局部變量。

但我不知道爲什麼我們必須存儲舊的幀指針時,去新的堆棧幀?

這是因爲這樣做會使堆棧跟蹤更易於調試嗎?

以下是我的測試代碼:

foobar: 
.LFB0: 
    .cfi_startproc 
    push ebp     #Why do this here?? 
    .... 
    .... 
    mov ebp, esp 

在此先感謝

回答

4

你甚至不必使用幀指針,調用約定不強制要求和優化的代碼經常沒有按「T。調用約定規定的是,一些寄存器被保存了,也就是說它們必須保存給調用者。這通常包括ebp。這個要求可以通過推/拉它來實現。

作爲一個副作用,如果您確實使用幀指針並且知道調用者的結構,則可以使用它來訪問其框架。然而這通常不被使用。