當我們調用一個函數(假設有3個參數)時,變量如何存儲在堆棧內存中。功能調用時的堆棧存儲
2
A
回答
4
它完全取決於實現如何將參數傳遞給函數。
函數參數可能不會傳遞到堆棧;例如,它們可以通過寄存器傳遞。
您將需要查找特定平臺的信息以確定參數如何傳遞。維基百科有一整頁致力於the various x86 calling conventions。
1
將參數壓入堆棧時,C會從右向左進行。但是,根據體系結構和參數數量,可能不會使用堆棧(或僅部分使用),而是使用寄存器來代替。
爲了論證,讓我們說我們正在處理x86架構(32位)。堆棧幀將看起來像...
(Stack grows down. High stack address is here)
arg3
arg2
arg1
ret addr <--- Auto pushed by 'call'
old base ptr <--- Called function typically saves the old base ptr
... <--- Carve space for local variables
(Low stack address is here.)
與繼續以上實例,被調用的函數可以使用以下訪問參數...
movl 8(%ebp), %eax // move arg1 into EAX
movl 12(%ebp), %edx // move arg2 into EDX
等。
如果我沒有記錯的話,PowerPC有八個(8)寄存器可用於傳遞參數 - r3 ... r10(含)。至於其他體系結構,您必須查看它們。
希望這會有所幫助。
+0
「C從右到左」是特定於實現的。它描述了x86上C實現通常使用的「cdecl」調用約定。一個實現可以自由地將參數從左向右或以任何其他順序推送。 – 2010-04-09 18:46:00
相關問題
- 1. 堆棧上的C++存儲保存在堆棧上
- 2. JVM堆棧存儲器
- 3. 使用存儲在堆棧(JavaFX的)
- 4. 'this'引用是否存儲在Java的調用堆棧中?
- 5. 的OpenGL:矩陣堆棧的功能
- 6. 輪詢AJAX功能超過調用堆棧
- 7. 最大調用堆棧尺寸上匯聚一系列功能
- 8. JavaScript調用堆棧
- 9. erlang調用堆棧
- 10. jQuery調用堆棧?
- 11. C中的堆棧跟蹤功能
- 12. 構造函數調用的存儲位置在哪裏?堆棧還是堆?
- 13. 存儲ImageView的ArrayList和堆棧Android
- 14. POSIX調用堆棧內存分配
- 15. 從休眠調用Oracle存儲功能
- 16. 堆棧轉儲使用alloc
- 17. UWSGI堆棧轉儲
- 18. 堆棧數據存儲順序
- 19. iPhone優化堆棧數據存儲
- 20. 在遞歸函數中存儲堆棧
- 21. 堆棧存儲結構指針c
- 22. 存儲的功能
- 23. 調用堆棧上的異常處理堆棧幀的順序
- 24. 使用Visual Studio調試崩潰轉儲時缺少調用堆棧幀
- 25. 類的字段,它們是存儲在堆棧還是堆?
- 26. 協程調用堆棧
- 27. 調用堆棧性病:: bad_function_call
- 28. 調用堆棧管理
- 29. 服務調用堆棧
- 30. PHP調用堆棧問題
是的,在sparc上,前六個參數在寄存器中,但後來發現寄存器窗口溢出... – 2010-04-09 03:08:47