簡體   English   中英

ASM堆棧使用情況

[英]ASM Stack Usage

據我所知,當你需要實現函數或只是用完寄存器時,堆棧可用於存儲數據。 我的問題是通常使用的堆棧是什么內存。 我的印象是這取決於預取過程和其他因素。 此外,在什么時候堆疊被加載回RAM。

每個進程都有線程,每個線程都有一個堆棧。 每個進程都有自己的空間,稱為進程地址空間。 線程在此進程地址空間中分配其堆棧。 這個空間是一個虛擬空間,意味着一個進程獲得4 GB的進程空間,它可能並不總是在RAM上。 當其他進程需要RAM時,可能會將其分頁到輔助內存。 基本上,您可以假設堆棧是由OS管理的一塊內存,通過在輔助內存,RAM,緩存等之間移動來優化最佳讀/寫時間。

我主要在windows上工作,上面的語句適用於windows。 我不確定其他操作系統。

是的,當您需要臨時存儲時使用堆棧。 這可能就像函數持續時間的存儲一樣簡單,或者當你用完寄存器並且需要驅逐一個以重新調整它時提到。

不要僅僅了解指令集/硬件的工作原理。 通常稱為push和pop,這些指令通常采用寄存器,通常是專用的堆棧指針寄存器,它包含ram中的地址。 當推送發生時,該寄存器中的地址(堆棧指針)用於將該數據寫入/推入ram,並且相應地調整堆棧指針寄存器內容(ram地址)。 這一切都是由基於使用該指令的硬件完成的。 另一種方式是,基於堆棧指針地址和pop指令的風格讀取ram,ram的內容根據pop指令的風格放置在某處,並相應地調整堆棧指針寄存器內容。

使用什么ram地址,為什么? 這就是我認為你在問的問題。 嗯,這通常取決於系統設計人員,人們在系統中占用ram並在程序,數據,堆和堆棧之間進行划分。 通常你會看到,如果你有一個線性的ram塊你正在使用該ram的較低(地址)部分有程序本身,指令,就在那之上是該程序使用的數據,然后是剩余的記憶是這個沒有人的土地。 從內存的底部到頂部通常是堆的所在。 編譯器不知道malloc需要多少堆,只有程序員才需要。 堆棧通常從這個開放空間的頂部開始並向下擴展,你在堆棧上推送的每個東西都被推到你在堆棧上推送的最后一個東西的底部並且它會向下擴展。 堆棧和堆沖突存在非常真實的風險,這是程序員的工作(通常,一些語言/編譯器會燒掉大量額外的代碼,以便在您提出要求時嘗試阻止它)。 因此,通常堆棧與數據和bss區域隔壁的堆位於同一位置。 Certaily情況並非總是這樣,在某些嵌入式系統中,你的程序在rom中,而數據和堆(如果你足夠勇敢/瘋狂到足以在嵌入式系統中使用堆)都在ram的一部分中,而堆棧可能在ram的單獨部分中,而不是在data / heap ram旁邊。 也許是因為那個公羊比較快。 一個很好的例子就是游戲玩家的進步,有一個256K的內存是片外的,而且通用速度較慢,片上內部的32k速度要快得多,這是放置堆棧(和速度關鍵代碼)的好地方。 包含程序本身的rom(加上一些硬件使其不會慢慢變慢)。 有時你有像6502這樣的處理器,其中堆棧指令只在ram的特定區域上運行,我認為在地址0x200處有256個位置或類似的東西,以這種方式設計到硬件中。 芯片沒有關閉。 一些處理器,如ARM模式下的ARM,沒有堆棧指針,可以使用任何寄存器,並且沒有推送和彈出,它們是通用加載和存儲指令的別名。 按照慣例,編譯器通常將特定寄存器保留/用作堆棧指針,但不像其它處理器那樣需要它。 授予拇指和拇指2等其他手臂指令集,減少指令大小,刪除通用性質,並將傳統r13硬編碼為堆棧指針,因此對於那些模式你沒有選擇,你得到r13而你不使用通用指示您專門使用推送和彈出指令。

把所有這些都放在windows或linux或其他多線程/任務操作系統世界中。 沒有任何改變,處理器不會僅僅為操作系統重新設置其指令集,無論您在該處理器上運行什么軟件,都可以獲得相同的指令集。 操作系統的作用是使用MMU,使每個程序都具有在程序空間,數據空間,堆和堆棧中存在相對較小的固定內存量的錯覺。 MMU為程序提供了所有具有相同地址空間的錯覺,例如所有程序都可能認為它們的程序從地址0x8000開始,你不能讓所有程序都在一個地址,0x8000是一個虛擬地址,mmu將它映射到物理地址,每個程序都有一組不同的物理地址。 當操作系統切換到下一個任務/程序/線程時,它會保存您的堆棧指針和其他寄存器,並加載下一個程序的寄存器(勾選mmu)並在處理器上給它一些時間,它也認為它有自己的平面內存空間,包括程序空間,數據空間,堆和堆棧。

關於堆棧的大量理解是查看指令集。 故事的其余部分是如何選擇堆棧指針的地址,它可以根據平台,操作系統和編譯器而變化。 在很多情況下,鏈接描述文件或鏈接進程具有用戶定義的規則。 您作為程序員/用戶可能沒有意識到您可以控制它,因為您可能只使用編譯器默認值,但對於流行的編譯器(井鏈接器),您可以選擇更改它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM