我剛學完ARM架構/程序集。如果SP寄存器保存下一個存儲位置的地址來存放數據,那麼堆的地址是什麼?例如,在C++中,如果你在堆上聲明一個對象(例如MyObj example = new MyObj();
),那麼程序集看起來會是什麼樣子,從哪裏知道example
是哪裏?什麼寄存器指向堆?
4
A
回答
5
在此上下文中的堆棧是由OS/EABI提供的較低級別的結構。這就是爲什麼有一個傳統的註冊表。但是,堆是OS提供的更高層次的結構。因此,管理和使用它取決於與您的應用程序和操作系統的協議。在彙編術語中,您將使用該堆通過寄存器取消引用一些地址。
5
0
在ARM的EABI中,R13(SP)指向完全遞減堆棧中的最後推送數據。然而,沒有必要指出,在任何時候,這樣的代碼可以是合法的:
考慮到r0指向我們的程序可訪問的有效內存位置。
stmfd r0!, {r1-r12, sp, lr}
ldr r1, [r0]
mov r2, lr
sub lr, sp, #4
str sp, [r4]
add sp, lr, #4
ldmfd r0!, {r1-r12, sp, pc}
ofcourse它沒有任何意義,但它是唯一的一點是,如果你可以安全地重新加載SP,LR和其他所有被調用函數保存的寄存器,你可以從頭開始他們多,你想一邊回憶恢復他們的價值在返回給調用者之前。另一點,堆棧和堆可能不一定相同,堆是malloc/free類型構造的更高級別的抽象,而堆棧僅用於在4個寄存器不足或用於傳遞函數參數時保存被調用寄存器,數據結構和所有你可以想象的,但堆棧有點難以管理,因爲你必須自己跟蹤所有的數據,而不是僅僅將一個區域分配給一個指針,然後在完成後釋放它。
通常取決於程序和環境,您可以使用各種黑客和東西的優化技術,如明知腐敗的一些非暫存寄存器,並擺脫它,但是你必須要管理,在您的來電顯示功能,它應該是意識到在隨後的函數調用中會被劃傷的寄存器,因此EABI只有在將控制轉移到另一個程序或接管時纔有意義,您可以在CPU上執行您喜歡的任何操作,只需確保將其保留爲乾淨它是在你進入這個地方之前。
1
處理器需要一個特殊的堆棧指針寄存器,因爲有時(中斷或異常)處理器硬件必須直接修改SP,而不執行任何代碼。這對堆沒有必要,所以不需要使用特殊寄存器來指向堆。在運行時,操作系統決定特定的代碼塊在堆中的存儲位置,並且可以使用任何寄存器來保存該地址。
相關問題
- 1. 爲什麼指向16位寄存器的指針是uword?
- 2. 爲什麼在FreeBSD中重置堆棧指針寄存器?
- 3. 堆棧指針寄存器值
- 4. 這些寄存器爲什麼被推入堆棧?
- 5. 導出寄存器對堆棧的性能影響是什麼?
- 6. 寄存器和臨時寄存器有什麼區別?
- 7. 寄存器指定Keystone
- 8. 指針寄存器變量
- 9. 寄存器和指針
- 10. 爲什麼SSE指令保留YMM寄存器的高128位?
- 11. 如何將堆棧指針寄存器中的值存儲到存儲器(8085)?
- 12. 指向端口寄存器位的指針
- 13. MOV [EBX],AX - 指向寄存器的指針?
- 14. 堆棧指針寄存器如何工作
- 15. 爲什麼內存和寄存器不允許遞歸,而堆棧呢?
- 16. 什麼是ESP和EBP寄存器?
- 17. 什麼是專用寄存器?
- 18. 爲什麼24位寄存器?
- 19. 爲什麼只有四個寄存器?
- 20. PIC寄存器(%ebx)是做什麼的?
- 21. 爲什麼使用2個指針指向atmega微控制器的寄存器地址?
- 22. 讀取由GDB寄存器指向的內存
- 23. 將XMM寄存器推入堆棧
- 24. 堆棧上EBP寄存器的大小?
- 25. 定義寄存器堆棧陣列
- 26. 恢復用戶堆棧/寄存器
- 27. 爲什麼建立普通布爾MRSW寄存器需要2個寄存器?
- 28. 爲什麼使用臨時寄存器將值傳遞給段寄存器?
- 29. 當我們已經有程序計數器寄存器時,爲什麼我們需要一個堆棧指針寄存器?
- 30. 爲什麼編譯器將變量存儲在寄存器中?
這是編譯器的實現細節。 http://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf –
寄存器是CPU需要知道的事情。有一個SP寄存器,因爲CPU有特殊的硬件,可以自動執行堆棧操作(例如,發生中斷時保存上下文)。 CPU不知道或關心堆。 – TJD
堆不是硬件的東西,堆棧是。 heap和堆內的分配與語言和庫有關(與硬件無關)。 –