所以我一直在學習彙編,來到堆棧的主題,存儲本地,靜態和全局變量和東西。事情如何存儲在堆棧中?
但我很難想象它在我腦海中。
底部的內存,但頂部的堆棧,:S whaa?
讓我感到困惑的是,每當有東西被推入堆棧時,堆棧指針就會被減去。它不應該添加到它。
我的意思是我得到的代碼,但它很難不知道真的發生了什麼。
所以我一直在學習彙編,來到堆棧的主題,存儲本地,靜態和全局變量和東西。事情如何存儲在堆棧中?
但我很難想象它在我腦海中。
底部的內存,但頂部的堆棧,:S whaa?
讓我感到困惑的是,每當有東西被推入堆棧時,堆棧指針就會被減去。它不應該添加到它。
我的意思是我得到的代碼,但它很難不知道真的發生了什麼。
這是事實,許多CPU架構堆棧指針下降當事情是推到堆棧中。這是真正的CPU的實現細節,但如果你覺得還不清楚,你可以試着想象堆就像是這個圖上完成:
68000 CPU stack http://www.eventhelix.com/RealtimeMantra/Basics/CToAss1.gif
的內存,你下移地址增加,但是當你想推東西在頂部你把它放在頂部(在一個較低的地址)。
(上圖可以在EventHelix.com找到。)
將其視爲實施細節。在許多體系結構中,當您將某些東西推入堆棧時,堆棧指針會被減去,以使堆棧向下(向較小的地址)增長。就這樣。
他們之所以這樣做是因爲堆棧與堆共享相同的內存塊。堆棧從頂部(低地址)增長到底部(高地址數量),堆棧從底部(高地址)增長到頂部(底部)。
這樣做是爲了不需要預測兩次內存量(一個用於堆而另一個用於堆棧)。
00000000 HEAP----
00000001 ||||||||
00000002 vvvvvvvv
FFFFFFFD ^^^^^^^^
FFFFFFFE ||||||||
FFFFFFFF Stack
希望這會有所幫助。
減少SP的原因很簡單:(*)堆棧被添加到「從底部」(關於內存位置)。這將有點像你有一個「待辦事項列表」。您可以在頁面頂部開始它,而不是在列表中隨意標記單個項目(就像我們通常所做的那樣),您只需啓動並完成頁面最遠的任務即可。
使用堆棧頂部(即從較高地址)的內存的原因是,它允許另一個重要的內存存儲,堆在另一個方向上增長(至少,這是在一些內存模型)。繼續進行「待辦事項列表」類比,現在您還將在頁面底部寫另一個列表,例如購物清單。但是,這個列表是堆的,你可以讓自己在任意地方隨意擦除東西,當你穿過商店時,以及重新使用一些被擦除線條留下的空間。
現在冒着爲混亂添加更多材料的風險,堆棧管理的另一個重要元素是stack frame的概念,這是一種將參數存儲到函數和局部變量的便捷方式,對應於嵌套函數調用的「整體上下文」。
(*)在許多CPU上,也就是說。正如Pierr指出的那樣,有些CPU與一個堆棧一起工作,當事物被推動時,它將SP「向上」(增加)。
堆棧向下增長,堆長大,這樣你就不必決定多少每個。事實上,現在的情況比現在更復雜,但x86和其他公司都有機器操作,並且內置了這個假設。無論如何,這並不重要,機器的增加和減少同樣好。
堆棧的「頂部」與堆棧在內存中的佈局無關。
這是一個數據結構。 「堆棧」類比是一個概念模型,它在內存空間中向上或向下增長的事實只是一個實現細節。哎呀,它使用連續的內存塊的事實僅僅是一個實現細節;例如,如果您將它作爲鏈接列表實現,那麼您可以有一個堆棧,其中的項目遍佈整個地方。
它甚至不是一個真正的堆棧:例如,考慮到即使該教科書說它是「後進先出」,您實際上可以在堆棧中間更改項目。
你需要實現一個堆棧是什麼:
內存佈局如何看起來與任何它沒有任何關係。
+1用於說明。 – outis
這真棒,感謝圖 – saint
至於什麼點將堆棧溢出? – Moak