我正準備在維基百科張貼在尾遞歸一個文章:http://en.wikipedia.org/wiki/Tail_call查詢在彙編語言堆棧指針使用
現在,這裏在文章的最後,示例說明如何使用堆棧指針來訪問傳遞給參數彙編僞代碼中的函數調用。這不是錯的嗎?我的意思是參數是由被調用者通過使用框架指針而不是堆棧指針來訪問的?
我正準備在維基百科張貼在尾遞歸一個文章:http://en.wikipedia.org/wiki/Tail_call查詢在彙編語言堆棧指針使用
現在,這裏在文章的最後,示例說明如何使用堆棧指針來訪問傳遞給參數彙編僞代碼中的函數調用。這不是錯的嗎?我的意思是參數是由被調用者通過使用框架指針而不是堆棧指針來訪問的?
使用堆棧指針很好。畢竟它總是指向堆棧。如果函數中有任何推入或彈出指令,那麼跟蹤堆棧指針到函數參數的偏移量就會有點困難。當沒有幀指針時,它很難在調試器中返回堆棧。
使用幀指針可以使調試器和編譯器的作業變得更容易,但不一定需要。
設置幀指針需要一條指令,它使用了一個可能用於其他事情的寄存器。因此,使用堆棧指針是優化代碼的常用技巧。微軟的編譯器甚至有這個優化的名稱,他們稱之爲Frame Pointer Omission
專用幀指針寄存器絕對是常見ABI個比較流行的調用約定,但在使用不同的(可能更簡單)的調用約定時,這純粹是用於說明目的(添加一幀指針寄存器沒有什麼本質上的「錯誤」對那些片段只會讓他們更長時間,並沒有什麼實質性的變化)。
感謝您的信息。此網站是目前該區塊中最好的 – 2010-03-02 02:43:01
準確簡短的答覆。感謝您的信息John – 2010-03-02 02:43:54
John,只是一個簡單的問題。當你說使用Frame指針調試器的工作變得容易時,你在說什麼調試器? – 2010-03-02 02:47:40
任何調試器。當你有幀指針時,很容易重建調用堆棧並將其顯示在調試窗口中。如果沒有幀指針,調試器必須實際反編譯代碼才能顯示調用堆棧。 – 2010-03-02 02:56:39