在我看到的大部分x86程序集(特別是NASM)代碼示例中(甚至在GCC生成的代碼示例中),我看到了「堆棧幀的設置」。就像這樣:x86彙編:爲什麼我需要堆棧框架?
main:
/*setting the stack frame*/
push ebp
mov ebp,esp
...
code goes here
...
/*removing the stack frame*/
mov esp, ebp
pop ebp
我對這種做法3個問題:
如果我的代碼沒有接觸到紙堆,然後設置/移除棧幀如上面是完全沒用的,對不對?
即使我的代碼使用堆棧,只要彈出我推送的所有東西(離開堆棧,因爲它本質上),然後再次設置堆棧幀是完全沒用的,對吧?
正如我所看到的,這樣做的唯一目的是保存ESP的價值,這樣我就可以在我的代碼上玩弄它而不用擔心搞砸了,一旦完成,我只需恢復其原始值。這是堆棧框架設置的目的還是我錯過了什麼?
感謝
如果要調試程序並查看堆棧跟蹤,則堆棧框架也是必需的。 – ctn
堆棧幀並不是真的需要。如你看到的。在X86-64中,我們沒有堆棧幀和ebp寄存器。所以你是對的,堆棧框架只是爲了方便使用。 – baotiao