回答
簡而言之,「是的」。您可以按照您指定的方式精確放大堆疊框架。但是,如您在問題的其餘部分所述,您可能會遇到堆棧對齊問題。
這些問題很少會在您自己的代碼中造成問題。老實說,只要你沒有違反體系結構的限制,你可以用任何你想要的方式管理堆棧和傳遞參數。
但是,爲了與系統和庫調用進行互操作,堆棧對齊通常是必需的。您可能會發現this文檔很有用。舉一個例子,x86和x86_64上的Linux下的GCC期望(強制)堆棧的16字節對齊,並使用cdecl
。
您可能希望在參考文檔中找到您正在使用的平臺和庫的任何調用標準和對齊要求。
您的意思是'cdecl'而不是'stdcall'。 – Jester
嗯..哎呀!謝謝! –
@ jester有一天我需要讓你進入聊天並找出你的背景。你的裝配知識真正廣泛而令人印象深刻。 :) –
- 1. VxWorks堆棧幀異常大
- 2. 對齊堆棧標籤
- 3. 關於堆棧幀的對齊,來自CSAPP的一個例子
- 4. 堆棧幀和堆棧指針
- 5. 打印堆棧幀
- 6. 洞察V8最大堆棧幀/尺寸
- 7. 獲取堆棧幀
- 8. 訪問堆棧幀
- 9. Qt,GCC,SSE和堆棧對齊
- 10. 對齊堆棧是什麼意思?
- 11. 使用鞋子時對齊堆棧
- 12. Bootstrap導航對齊堆棧li
- 13. 堆棧分配,填充和對齊
- 14. WPF堆棧面板居中對齊
- 15. Visual Studio 2008未對齊堆棧變量?
- 16. 從堆棧指針減去對齊?
- 17. x86上的堆棧對齊方式
- 18. 對齊堆棧上的數據(C++)
- 19. STDCALL和CDECL堆棧對齊尺寸
- 20. 緩存對齊的堆棧變量
- 21. 垂直對齊堆棧內容
- 22. 將堆棧對齊到RelativeLayout的底部?
- 23. 對齊或不對齊堆棧上的char數組?
- 24. 堆棧= java.lang.StackOverflowError的:堆棧大小8MB
- 25. 訪問Java堆棧幀
- 26. 堆棧幀內存分配
- 27. 瞭解堆棧幀C
- 28. 需要堆棧幀,ARM
- 29. 堆棧應該如何使用大對象堆棧?
- 30. 瞭解快速調用堆棧幀
技術上是的,但不要這樣做。如果您打算與其他代碼進行互操作,調用約定需要至少8個字節的對齊,可能是16個。錯位也涉及一些性能處罰。 – Jester
有可能,x86對它並不是很挑剔。不要進行任何函數調用,錯位的堆棧會降低它們的速度。或者當它們包含SIMD代碼時使它們完全失效,越來越常見因爲不應該進行調用,所以在沒有調整堆棧指針4或8時沒有任何意義。 –