2017-02-13 17 views
4

最近我重新編寫了一些libc函數在彙編中,並且對於其中一些(不需要任何調用系統調用指令,如strlen),我放棄了序言和後記,因爲我的測試沒有沒有它就失敗了(也許我沒有足夠複雜的測試)。 在同行評審期間,有人告訴我放棄它是一種不好的做法,但無法解釋爲什麼。編寫彙編函數時,序言和結語是強制性的嗎?

那麼,當我調用沒有序言/尾聲組合的asm函數時,是否會遇到問題?

即使在堆棧上不需要額外的空間時添加它也是一種很好的做法嗎?

如果由於某些原因是強制性的,爲什麼編譯器(我使用nasm)不關心它?

感謝您閱讀

+2

在優化的生產代碼中,如果不需要,跳過序言/尾聲。然而,對於調試或分析,有一個乾淨的棧幀可能是有用的,許多調試器依賴於此。 – Ctx

回答

4

如果沒有設置正確的堆棧幀,它可以是很難調試知道什麼工作,你是在現在。在ELF目標上,如果沒有明確設置堆棧幀,則必須手動提供CFI數據(參見this article)。如果沒有CFI數據,堆棧展開不起作用,調試器可能無法找到你所在的功能。除非你想手動添加CFI數據(這有點乏味且容易出錯),我建議你接受輕微的性能損失,並設置完整的堆棧幀。

+0

好吧,我明白了。我會嘗試在我的函數中使用和不使用新的堆棧框架進行一些調試,以獲得更好的結果 –