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...