當我們調用一個函數(假設有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. 堆vs堆棧存儲
- 2. 存儲在堆棧或堆
- 3. 搜索堆棧的值和存儲在臨時堆棧
- 4. 堆棧上的C++存儲保存在堆棧上
- 5. 在堆棧內存中存儲引用
- 6. JVM堆棧存儲器
- 7. 使用存儲在堆棧(JavaFX的)
- 8. 堆棧和堆棧內存存儲在C++
- 9. 'this'引用是否存儲在Java的調用堆棧中?
- 10. 調用堆棧
- 11. 功能調用期間的堆棧結構
- 12. 運行的setState道具功能懸掛最大調用堆棧
- 13. 轉化利用堆棧功能
- 14. 卡堆棧功能不起作用
- 15. ELK堆棧性能調優
- 16. 將堆棧內存不足的功能塊來重用
- 17. 使用堆棧來存儲對象
- 18. 堆棧溢出調用堆棧#timememoryfunctionlocation 10.0000143728
- 19. 的OpenGL:矩陣堆棧的功能
- 20. 最大調用堆棧尺寸上匯聚一系列功能
- 21. 輪詢AJAX功能超過調用堆棧
- 22. 將堆棧結構存儲在堆vs棧上
- 23. JavaScript調用堆棧
- 24. erlang調用堆棧
- 25. jQuery調用堆棧?
- 26. 構造函數調用的存儲位置在哪裏?堆棧還是堆?
- 27. 堆棧C++的打印功能
- 28. C中的堆棧跟蹤功能
- 29. 存儲ImageView的ArrayList和堆棧Android
- 30. 調用printf時的堆棧視圖?
是的,在sparc上,前六個參數在寄存器中,但後來發現寄存器窗口溢出... – 2010-04-09 03:08:47