棧是遵循先進後出原則,那指標是用來幹嘛的

2023-02-14 01:00:41 字數 5442 閱讀 1953

1樓:匿名使用者

當然可以啊,只要你能不弄錯先後,知道自己改的是什麼,修改完後恢復棧頂指標,完全可以修改棧資料,這也是種hack技術,不過這對程式設計技術要求很高,很危險,一不小心就會導致程式崩潰,然後你都不知道錯在**。

其實,你可以編寫一個簡單的函式,在main中呼叫它,編譯後設定斷點,然後除錯執行,執行到斷點處停止後,在除錯選單內選擇反彙編觀察這段**,你會發現,編譯器會在真正執行函式前都會安排一段指令修改棧資料的。

如下void fun()

{00164810  push        ebp  //基指標入棧備份

00164811  mov         ebp,esp  //棧頂指標賦值給基指標備用

00164813  sub         esp,0c0h  //修改棧頂,上移c0個位元組,留出空間給臨時變數

00164819  push        ebx  //地址暫存器入棧備份

0016481a  push        esi  //源址暫存器入棧備份

0016481b  push        edi  //目的暫存器入棧備份

0016481c  lea         edi,[ebp-0c0h]  //原棧頂指標向上偏移c0個位元組作為目的地址存入目的暫存器,注意此時ebp包含的是棧頂指標

00164822  mov         ecx,30h//設定迴圈次數,每次賦值一個雙字,即4位元組,所以4*30h正好為c0個位元組。

00164827  mov         eax,0cccccccch  //設定填充值,4個位元組的cc,cc為中斷指令3,即int 3,防止程式意外跳轉到該臨時資料區執行時會呼叫系統中斷#3處理

0016482c  rep stos    dword ptr es:[edi]//執行迴圈填充資料

2樓:匿名使用者

不行 因為要遵循先進後出的原則

3樓:匿名使用者

我靠~~~~~~~這麼專業的知識~~~~~~~~~~~~~~~~~~~~~

請解釋一下入棧運算和退棧運算,最好用舉例子的方法,特別搞不懂棧頂指標的位置是怎麼回事?

4樓:匿名使用者

棧(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等內。其操作方式類似於資料結容構中的棧。

棧是一種資料結構,它按照先進後出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料(最後一個資料被第一個讀出來)。

棧是只能在某一端插入和刪除的特殊線性表。用桶堆積物品,先堆進來的壓在底下,隨後一件一件往堆。取走時,只能從上面一件一件取。堆和取都在頂部進行,底部一般是不動的。

棧就是一種類似桶堆積物品的資料結構,進行刪除和插入的一端稱棧頂,另一堆稱棧底。插入一般稱為進棧(push),刪除則稱為退棧(pop)。 棧也稱為後進先出表(lifo表)。

例如:有一個數列(23,45,3,7,3,945)

我們先對其進行進棧操作,則進棧順序為:23,45,3,7,3,945

我們在對其進行出棧操作,則出棧順序為:945,3,7,3,45,23

進棧出棧就像只有一個口的長筒,先把資料一個個放入筒內,而拿出的時候只有先拿走上邊的,才能拿走下邊的。

入棧、出棧指標和資料操作順序是什麼樣的?

微控制器 壓棧 彈棧 堆疊指標什麼意思

5樓:生活如歌

壓棧(入棧)push指令,將資料儲存在特定儲存區內,按先進後出,後進先出原則儲存。

彈棧(出棧)pop指令,將儲存在堆疊中的數取出來,也是按先進後出,後進先出原則取數。

指標可以理解成用來指揮入棧出棧的一個通道,所有數的出入均由指標來指定。

6樓:雅寧姐對不起

子彈,彈夾知道不,堆疊也就類似於彈夾,那資料就類似於子彈,先壓進去的後出來,後壓進去的先出來,指標始終指向棧頂。對於堆疊沒有什麼確定的定義,一般書上都是說「一段滿足先進後出,後進先出的資料段」

7樓:匿名使用者

後進先出的資料結構,屬資料結構概念

8樓:彌久墨香

程式的執行是按順序執行的,當你的應用程式中有分支或中斷子程式時,在微控制器響應中斷從主程式中跳轉到中斷程式,則程式指標pc(順序號)也就變了,當子程式執行完,程式就不能自動回到原來從主程式跳轉出來的位置繼續執行主程式。

因此,在進入子程式時有時需要壓棧(就是把執行子程式之前的那個主程式地址儲存),當執行完子程式,再彈棧(就是把被儲存主程式埠地址重新送到pc),以便返回主程式斷點繼續執行文執行完的主程式。

關於入棧,出棧指標和資料操作順序的疑問

9樓:匿名使用者

出入堆疊和裝貨一樣的道理,怎麼說呢?你仔細想想就明白了

10樓:匿名使用者

形象的說, 棧 就是一個上面有標籤欄的桶. 標籤欄(類似超女投票的那種)就代表指標.桶底就是棧底.

桶頂就是棧頂. 拿一個東西準備放入桶,先要往裡面扔一個標籤(指標定位).然後在把東西(資料)放進桶裡.

可以想象一下.後放進去的東西總是壓在前一個東西的上面.要拿的話也是先拿最後一個.

11樓:匿名使用者

打個比方:假如你是房東,有人要住你的房子,那他住進來前你肯定要先把房子騰空,然後讓他住進來;反之,如果你不租給他住了,肯定是要先把房客趕出去,然後再使用空出來的房子。

道理是一樣的,你把堆疊看成是房子,資料看成是房客,就會懂了。

12樓:匿名使用者

堆疊主要用於儲存臨時資料、本地變數和中斷、子程式呼叫產生後的返回地址。堆疊指標暫存器通常指向堆疊的頂部。注意堆疊的執行是從較高的儲存器地址到較低的儲存器地址。

也就是說,一條堆疊push命令會使堆疊指標減小堆疊指標指向資料sram堆疊區域中子程式和中斷堆疊被定位的位置。在任何子程式被呼叫或中斷被使能之前,位於資料sram中的這一堆疊空間必須由程式定義好。堆疊指標必須被設在0x60之上。

當使用push指令向堆疊中壓入一個資料時,堆疊指標自動減1;而當返回地址被子程式呼叫或中斷壓入堆疊時,堆疊指標自動減2。當使用pop指令把一個資料從堆疊中彈出時,堆疊指標自動加1;而由子程式的ret或中斷程式的reti彈出資料時,堆疊指標自動加2。

希望對你有幫助!

13樓:匿名使用者

先進後出啊

就像一次只能過一個人的橋,先過去的肯定是最後一個回來。

14樓:匿名使用者

2樓說的經典,就是這樣的!

15樓:匿名使用者

其實沒那麼神祕 主要是看你自己定義棧的時候是怎麼樣的有的把初始top=-1 當然是要先加再入咯 或者的top=0時候可以入再加 也可以先加再入 還有一個問題是看你的棧頂是不是作為空的來處理

比如有些設計的時候棧頂就是空的沒有儲存資料 有的是有儲存資料的最後一點是出棧和入棧操作的對稱的前面是++top的話 後面就的top--

反之亦然

堆疊指標(sp)的作用是什麼?在程式設計時,為什麼還要對 sp重新賦值?

16樓:匿名使用者

堆疊指標的作用就是指向棧頂元素的,通過它還可以對棧頂元素進行出棧操作

當堆疊中的元素進行出棧或入棧操作時,都會使棧頂元素髮生變化,堆疊指標sp就需要重新賦值,讓其指向新的棧頂元素

17樓:匿名使用者

堆疊是一種執行「後進先出」演算法的資料結構。 設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。

現在把不同編號的小球放到竹筒裡面,可以發現一種規律:先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以「先進後出」就是這種結構的特點。

堆疊就是這樣一種資料結構。它是在記憶體中開闢一個儲存區域,資料一個一個順序地存入(也就是「壓入——push」)這個區域之中。有一個地址指標總指向最後一個壓入堆疊的資料所在的資料單元,存放這個地址指標的暫存器就叫做堆疊指示器。

開始放入資料的單元叫做「棧底」。資料一個一個地存入,這個過程叫做「壓棧」。在壓棧的過程中,每有一個資料壓入堆疊,就放在和前一個單元相連的後面一個單元中,堆疊指示器中的地址自動加1。

讀取這些資料時,按照堆疊指示器中的地址讀取資料,堆疊指示器中的地址數自動減 1。這個過程叫做「彈出pop」。如此就實現了後進先出的原則。

堆疊是計算機中最常用的一種資料結構,比如函式的呼叫在計算機中是用堆疊實現的。 堆疊可以用陣列儲存,也可以用以後會介紹的連結串列儲存。 下面是一個堆疊的結構體定義,包括一個棧頂指標,一個資料項陣列。

棧頂指標最開始指向-1,然後存入資料時,棧頂指標加1,取出資料後,棧頂指標減1。 #define max_size 100 typedef int data_type; struct stack ;

堆疊棧頂地址高還是棧底地址高?還要進棧出棧的順序如何,即先調整指標還是先壓棧或出棧,順序很重要嗎?

18樓:匿名使用者

如果是你自己寫一段**來實現棧,那所有的這些問題都取決於你自己的決定。

但要注意的是壓棧和出棧的匹配。

就是說,如果你是先壓棧,後移動指標,那說明指標指向的是空閒的區域。那出棧的時候就要先移動指標,再取值。

如果你問的是程式執行時臨時變數存放的棧。那低地址是棧頂還是高地址是棧頂,這取決於系統架構。x86平臺和arm平臺等等,是不同的。

19樓:匿名使用者

順序很關鍵,因為棧式是先進後出,後進先出

「->」表示什麼,棧的棧底指標指向哪,棧頂指標指向哪?

20樓:匿名使用者

樓主問的棧只有一個棧頂指標而沒有棧底指標 棧這個資料結構就像水桶 沒有水的時候 棧頂指標指向桶底部 有水的時候棧頂指標指向水面

通俗的講s->ptop指向水面的那個位置

s->ptop->data 當然就是水面那個位置存放的水了上面說的水就是一種資料型別了 比如 int

21樓:

資料顯示 ->在結構體裡使用 這是c語言符號的使用規則了提到的 那麼 嚴格的說 這樣的寫法 可能在c語言上是不可靠的 當然 也不能說不對的就是錯的 可能它可以執行 但是不符合人們的常用規則 在結構體裡是包含的意思 定義一個結構體 裡面的元素要使用 都要是 結構體名字->元素名字 這裡可以理解為 棧s裡面的ptop指標指向的結構體裡面的元素date 這個棧存放的可能是一個結構體 那麼指標每次指向的不是一個單純的記憶體單元 而是一個結構體單元 這個單元裡面可能還有year month weak等 這時候就需要用->指明其包含關係 說明是這個單元裡的哪一個

棧頂指標是位於高地址還是低地址?說明理由

22樓:

是高地址。

棧是從高地址向低地址延伸的,所以棧頂是高地址。

先進先出法 後進後出法 先進後出法 後進先出法的含義與區別是

先進先出法是以bai先購入的存貨先du發出,據此確定發出存zhi貨和期末dao存貨的成本。回 後進先出法是以較後答購入的存貨先發出,據此確定發出存貨和期末存貨的成本。先進後出法其實就是後進先出法。後進後出法其實就是先進先出法。上述兩種方法均指發出存貨的計價方法,而與存貨本身實際發出先後順序無關。比如...

什麼茶泡出後是藍綠色的,菊花茶泡水後,顏色變藍綠色,是什麼原因?是正常的,還是不正常?謝謝!

現在假冒的東西很多,不明確的時候還是不要喝了 菊花茶泡水後,顏色變藍綠色,是什麼原因?是正常的,還是不正常?謝謝!菊花抄茶變綠色的原因是不同bai的菊花中含有不同量的花色du素,它可以與水zhi中的酸性或鹼性物質發dao生成色作用,當遇到水質ph值呈鹼性時,花色素就會變成藍綠色,而且還與溫度有關,沖...

我是農曆初3出生的,那時後陽曆是幾月幾號

陽曆是 1987年10月25日 星期日 天蠍座 9月初三,陰曆,是多少號 你好,72 年 10 月 9 日星期一 農曆壬子土年九月大初三日 庚戌金 季秋 月癸酉金危閉日 本日物候 鴻雁來賓 歲煞東 雞日衝 丁卯 兔 今年有兩個九月 陰曆 分別是十月廿六和十一月廿四 陽曆 希望對你有幫助!9 26 1...