2009-10-29 88 views
1

所以我一直在學習彙編,來到堆棧的主題,存儲本地,靜態和全局變量和東西。事情如何存儲在堆棧中?

但我很難想象它在我腦海中。

底部的內存,但頂部的堆棧,:S whaa?

讓我感到困惑的是,每當有東西被推入堆棧時,堆棧指針就會被減去。它不應該添加到它。

我的意思是我得到的代碼,但它很難不知道真的發生了什麼。

回答

7

這是事實,許多CPU架構堆棧指針下降當事情是到堆棧中。這是真正的CPU的實現細節,但如果你覺得還不清楚,你可以試着想象堆就像是這個圖上完成:

68000 CPU stack http://www.eventhelix.com/RealtimeMantra/Basics/CToAss1.gif

的內存,你下移地址增加,但是當你想東西在頂部你把它放在頂部(在一個較低的地址)。

(上圖可以在EventHelix.com找到。)

+0

+1用於說明。 – outis

+0

這真棒,感謝圖 – saint

+0

至於什麼點將堆棧溢出? – Moak

2

將其視爲實施細節。在許多體系結構中,當您將某些東西推入堆棧時,堆棧指針會被減去,以使堆棧向下(向較小的地址)增長。就這樣。

2

他們之所以這樣做是因爲堆棧與堆共享相同的內存塊。堆棧從頂部(低地址)增長到底部(高地址數量),堆棧從底部(高地址)增長到頂部(底部)。

這樣做是爲了不需要預測兩次內存量(一個用於堆而另一個用於堆棧)。

00000000 HEAP---- 
00000001 |||||||| 
00000002 vvvvvvvv 

FFFFFFFD ^^^^^^^^ 
FFFFFFFE |||||||| 
FFFFFFFF Stack 

希望這會有所幫助。

1

減少SP的原因很簡單:(*)堆棧被添加到「從底部」(關於內存位置)。這將有點像你有一個「待辦事項列表」。您可以在頁面頂部開始它,而不是在列表中隨意標記單個項目(就像我們通常所做的那樣),您只需啓動並完成頁面最遠的任務即可。

使用堆棧頂部(即從較高地址)的內存的原因是,它允許另一個重要的內存存儲,堆在另一個方向上增長(至少,這是在一些內存模型)。繼續進行「待辦事項列表」類比,現在您還將在頁面底部寫另一個列表,例如購物清單。但是,這個列表是堆的,你可以讓自己在任意地方隨意擦除東西,當你穿過商店時,以及重新使用一些被擦除線條留下的空間。

現在冒着爲混亂添加更多材料的風險,堆棧管理的另一個重要元素是stack frame的概念,這是一種將參數存儲到函數和局部變量的便捷方式,對應於嵌套函數調用的「整體上下文」。

(*)在許多CPU上,也就是說。正如Pierr指出的那樣,有些CPU與一個堆棧一起工作,當事物被推動時,它將SP「向上」(增加)。

3

讓我感到困惑的事情是,每當有東西被壓入堆棧,堆棧指針就會被減去。它不應該添加到它。

它可能是。這取決於堆棧是向上還是向下擴展。

Understand the stack

Stack grow direction

+0

非常有幫助的鏈接,謝謝! – saint

0

堆棧向下增長,堆長大,這樣你就不必決定多少每個。事實上,現在的情況比現在更復雜,但x86和其他公司都有機器操作,並且內置了這個假設。無論如何,這並不重要,機器的增加和減少同樣好。

0

堆棧的「頂部」與堆棧在內存中的佈局無關。

這是一個數據結構。 「堆棧」類比是一個概念模型,它在內存空間中向上或向下增長的事實只是一個實現細節。哎呀,它使用連續的內存塊的事實僅僅是一個實現細節;例如,如果您將它作爲鏈接列表實現,那麼您可以有一個堆棧,其中的項目遍佈整個地方。

它甚至不是一個真正的堆棧:例如,考慮到即使該教科書說它是「後進先出」,您實際上可以在堆棧中間更改項目。

你需要實現一個堆棧是什麼:

  • 的一種方式指向每一幀堆棧
  • 指向堆棧的最後一個插入的元素的一種方式的/件(又名棧頂)
  • 一種方式來獲得到前一個元素
  • 插入到最後一個元素的一種方法/頂
  • 以除去年底/頂部的元素,使得它的前一個元素,成爲新的最後/ top元素。

內存佈局如何看起來與任何它沒有任何關係。