堆疊指標sp在片內ram128b中開闢棧區,並隨時跟蹤棧頂位址。它是按"先進後出"的原則訪問資料。開機復位後,微控制器棧底位址為07h。
主要用來儲存臨時資料,區域性變數和中斷/自程式的返回位址。
堆疊指標總是指向棧頂元素。所以資料入棧的時候,堆疊指標先加1,再壓棧。向上增長方式。和計算機的方式一樣。
出棧的時候先彈出資料,堆疊指標再減1。
如果堆疊的實現是往上長的(就是說往頂的方向長,其實質是你的棧底是定死的不能動,入棧的東西只能不斷往上疊,這就像你在書桌上放書一樣,桌底是定死的,所以你的書只能一本一本地往上堆,往上長),計算機內部的堆疊的實現採取的就是這種模式,所以就得像你說的那樣,「先修改指標,然後插入資料,出棧時剛好相反」,因為你堆疊指標指向的總是棧頂元素,棧底不能動,所以資料入棧前要先修改指標使它指向新的空餘空間然後再把資料存進去,出棧的時候自然相反。
然而,如果堆疊的實現是往下長的(就是說你每壓乙個元素入棧,棧底就自動下移乙個元素的位置,其實質就是這種堆疊模型是乙個「無底洞」型),這個時候,你的棧頂就變成了定死的,你就可以先壓入元素,然後再修改指標。因為你的棧底是無限的,你壓入乙個元素,新的元素就取代先前的棧頂元素佔據棧頂的位置,那麼你先前的指向棧頂元素的指標這個時候就該修改讓它指向這個新的棧頂元素了。
下面的就是對「無底洞」型堆疊的一種實現的描述:
壓棧(入棧):將物件或者資料壓入棧中,更新棧頂指標,使其指向最**棧的物件或資料。
彈棧(出棧):返回棧頂指向的物件或資料,並從棧中刪除該物件或資料,更新棧頂。
話說回來,計算機內部肯定選第一種模型,不會選第二種,因為第二種模型,每壓入乙個新的元素,都需要把之前堆疊裡的所有元素整體下移動乙個元素的位置,騰出棧頂元素的位置讓新的元素進來,這種平移可是一筆不小的開銷啊!但是並不是說「無底洞」模型就沒辦法實現了,其實它可以通過第一種模型來模擬的,每需要壓入乙個新的元素的時候,就先開闢乙個空間,資料存入這個空間,然後再修改棧頂元素指標使其指向這個新的棧頂元素。
換句話說,用鍊錶的話,只要有足夠的空間可開闢出來作為乙個節點,那麼兩種堆疊模型都能實現(當然「無底洞」型還是如我上面說的那樣用第一種模擬出來的,否則平移的工作量相當可觀),如果用陣列,由於陣列在記憶體中是連續分配出來的空間,用第一種模型更自然一些
斷點指標和任務堆疊指標
斷點資料 把任務被中止執行時的位置叫做斷點,把當時存放在cpu的pc psw和通用暫存器等各暫存器中的資料叫做斷點資料。斷點指標 任務被終止時 在pc暫存器中 cpu的當前程式執行指標。任務堆疊指標 指向任務堆疊棧頂的指標 乙個任務包含 任務控制塊 任務堆疊 任務 ucos進行任務切換時,osctx...
變數指標總結,堆疊
include stdafx.h include stdio.h int c1 const b1 void fuzhi static int a 3 printf d n a const int b 5 printf d n b b1 b int c 6 printf d n c c1 c int ...
堆疊記憶體和指標
首先,堆疊都是記憶體。棧是記憶體上面的,先進後出。堆是記憶體上面的,先進先出。堆疊和記憶體的關聯 乙個32位程式,那麼32位位址只能表示4g的空間。那麼棧就只有4g,而堆就有你的實際記憶體大小。這句話是錯的,正確的是,棧 堆 全域性靜態區 4g 注意 電腦核心使用2g,自己則只能使用最大2g,而執行...