出棧和壓棧應如何理解,壓棧 和 出棧 是什麼意思啊 ?

2021-03-22 05:48:58 字數 5855 閱讀 2318

1樓:匿名使用者

堆疊是ram中劃出的一片特殊儲存區,用於臨時存放一些重要資料(這些資料存放一會後是必須回到原位的),其中資料的位置由堆疊指標確定,而資料的存放和讀取則由入棧指令和出棧指令控制,入出必須對應成對的使用才能使壓入的資料正確的回到壓入前的位置。

比如:當前正在執行某程式,要呼叫乙個子程式,而子程式中會用到a、b、c三單元,主程式中這三個單元中現有的資訊在子程式執行結束後還要繼續用的,那麼就需要用堆疊臨時儲存這些資料,等子程式結束後再還原。入棧時是壓入a、壓入b、壓入c,出棧則必須是出c、出b、出a。

這就好比子彈夾,先壓進去的子彈在下,後壓進去的在上,子彈進入槍膛(相當於出棧)則是相反,先上面後下面,正如一樓「一疊盤子」的比喻。這種用法的約定,是堆疊本身特性決定的,必須遵守。

2樓:匿名使用者

棧是資料結構的概念。可以把棧比成一堆疊放的盤子,出棧就是取出最頂端的盤子,壓棧就是把外面的盤子放到頂端。除此之外棧不能有其它操作。因此它和佇列一樣是受限的線性表。

壓棧 和 出棧 是什麼意思啊`?

3樓:匿名使用者

可以理解成機槍的彈夾,彈夾就是乙個棧,子彈一顆一顆壓進去,就是壓棧,有個順序特點就是先進後出,後進先出,出棧就是子彈裝號了一顆一顆打出來,棧的清理就是把彈夾清空,清掉彈夾裡的子彈。堆疊就是把子彈放到彈夾裡,堆在那裡了,實際意思都差不多。

c語言裡棧就可以用陣列來做,把資料像子彈一樣壓陣列裡就是了。

4樓:匿名使用者

棧是儲存的系統 壓棧是寫入資料 出棧是輸出資料 先進後出 後進先出

5樓:匿名使用者

壓棧即進棧,用push表示,每壓棧一次減2,出棧用pop表示,沒出棧一次加2,

怎麼理解彙編中sp暫存器的出棧壓棧???

6樓:做而論道

類似於山洞探險,怎麼進去,還要怎麼出來。

腦子裡面,就要記住走過的路。

退出時,後記憶的,應該先想起來。

程式,也是這樣,子程式套子程式,子程式再套子程式,怎麼才回到主程式?

就必須使用堆疊來儲存歷史資訊。

7樓:匿名使用者

使用call指令呼叫時需要壓入偏移值(遠呼叫還需要壓入段暫存器),ret,retn指令返回時需要彈出棧中的偏移值,retf,iret,還需要彈出段。(要不然cpu哪曉得返回到**繼續執行)

c語言利用棧建立棧幀,用於存放臨時變數(比呼叫api向系統申請可用記憶體快多了)。

8樓:匿名使用者

orange,乙個作業系統的實現

30天自製作業系統

都有講到。

c語言的壓棧 和入棧 出棧什麼意思 啊 誰有什麼好方法理解一些

9樓:百度使用者

棧的特點是先進後出。

你把棧當成乙個水桶,把書一本本放進去,然後最先放的書就被壓在最下面,所以最先進去的,最後出來。

壓棧就是入棧就是把書放進水桶,出棧就是把書拿出來。

什麼是堆和棧?函式壓棧是怎麼回事?

10樓:匿名使用者

什麼是堆和棧?

乙個由c/c++編譯的程式佔用的記憶體分為以下幾個部分

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

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列,呵呵。

3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放

4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放

5、程式**區—存放函式體的二進位制**。

函式壓棧是怎麼回事?

函式壓棧的本質是引數傳遞

這又跟組合語言連繫起來了.組合語言的過程即proc可以理解成函式

比如乙個最簡單的計算兩數之和函式

如果用彙編來寫估計是這樣的

sub proc

pop ax ;從stack取a 並放在ax暫存器中

pop bx ;從stack取b 並放在bx暫存器中

add ax,bx ; 計算a+b

ret //返回

sub endp

顯然要呼叫這個函式,你應當先把b值push進stack,然後再push a

因為stack是先進後出的

所以呼叫彙編像這樣

比如計算4+5

push 5;

push 4;

call sub; //返回值在ax中

在這個例子中先壓5或先壓4得到的結果沒有變化

但大多數程式,如果引數的順序錯誤將是災難性的

因為不管什麼高階語言最終都要編譯成組合語言,然後是機器語言

同樣下面這個c程式,計算a+b值,必然會編譯成上面的彙編**

int sub(int a ,int b)

所以c在呼叫這個函式sub時,必須要壓棧(即傳入引數)但這些工作,在c語言裡,並不需要你來完成.你只要寫出

sub(7,9);

編譯器在編譯成彙編時就會自動完成相關的壓棧工作.

根據函式呼叫方式和引數壓入順序目前存在三種約定:

stdcall

cdecl

fastcall

這都相關壓棧順序和棧的清理工作約定

他們的細節都不相同,但有一點是肯定的,引數比須從右向左壓入棧中

stdcall中 函式必須自已清理棧

cdecall 由呼叫者清除堆疊 c的預設函式呼叫方式 所以這樣c支援可變引數

fastcall 是把函式引數列表的前三個引數放入暫存器eax,edx,ecx,其他引數壓棧

源**:

int function(int a, int b)

void main()

1.__cdecl

_function

push ebp

mov ebp, esp

mov eax, [ebp+8] ;引數1

add eax, [ebp+c] ;加上引數2

pop ebp

retn

_main

push ebp

mov ebp, esp

push 14h ;引數 2入棧

push 0ah ;引數 1入棧

call _function ;呼叫函式

add esp, 8 ;修正棧

xor eax, eax

pop ebp

retn

2.__fastcall

@function@8

push ebp

mov ebp, esp ;儲存棧指標

sub esp, 8 ;多了兩個區域性變數

mov [ebp-8], edx ;儲存引數 2

mov [ebp-4], ecx ;儲存引數 1

mov eax, [ebp-4] ;引數 1

add eax, [ebp-8] ;加上引數 2

mov esp, ebp ;修正棧

pop ebp

retn

_main

push ebp

mov ebp, esp

mov edx, 14h ;引數 2給edx

mov ecx, 0ah ;引數 1給ecx

call @function@8 ;呼叫函式

xor eax, eax

pop ebp

retn

3.__stdcall

_function@8

push ebp

mov ebp, esp

mov eax, [ebp] ;引數 1

add eax, [ebp+c] ;加上引數 2

pop ebp

retn 8 ;修復棧

_main

push ebp

mov ebp, esp

push 14h ;引數 2入棧

push 0ah ;引數 1入棧

call _function@8 ;函式呼叫

xor eax, eax

pop ebp

retn

11樓:匿名使用者

堆 heap

棧 stack

是兩種不同的資料結構

stack的特點是先入後出 就像疊盤子 先放上去的盤子後拿走(底里的抽不出來自然最後才能拿走)

stack和heap放在一起討論的話 其實不是講的資料結構了 是說作業系統給程式分配記憶體的方式

對於乙個程式來說 執行的時候 系統分配了一定記憶體給它 其中一塊叫堆 一塊叫棧

堆裡面主要放 動態分配的內容 比如c裡面用 malloc 分配到的空間 就在堆裡 c++裡面用new 分配到的也在堆裡

棧裡面放 函式的區域性變數

乙個函式的區域性變數 會在這個函式被呼叫時push到棧裡 這個函式返回的時候才從棧裡面pop出來

棧的先入後出的順序使得函式可以巢狀 遞迴 如果遞迴層數太多 棧也會滿 就會出現棧溢位……

一道組合語言題,望一步一步解釋下出棧和入棧到底是怎麼進行的,謝謝了

12樓:重行動

更具從上bai到下的順序,如下:du

第一步將zhieax(123456)壓入棧頂dao;內又將ax壓入棧頂;

出棧資料到容bx(ax);

將ebx(01020304)壓入棧,此時是第二層;

又將cx壓入棧(三層);

出棧資料到eax(cx);

出棧資料到cx(01020304);

各暫存器值eax(cx);(ebx)=01020304h ;(ecx)=05060108h ;sp(2000h-1);ax不變;

bx(ax);cx(01020304h)

詳細說明堆疊的功能及操作原理,及堆疊操作時如何入棧和出棧.

13樓:匿名使用者

看資料結構啊。後進先出。

入棧和出棧起到什麼作用啊?

14樓:匿名使用者

2樓!可以儲存資料,但是大多的時候是用來儲存斷點的經常用於函式之間傳遞引數用!

可以是值傳遞或者引用傳遞!

這些引數都是區域性引數

用完就被其它壓棧的資料覆蓋了!

壓棧 f(2); 2壓棧

當呼叫函式的時候 將2壓棧然後將指令轉移到函式體出棧 到a

出棧 f(int a)

15樓:匿名使用者

可以儲存資料,但是大多的時候是用來儲存斷點的

資料結構順序棧的出棧問題,資料結構課程棧出棧入棧問題

selemtype為什麼要用 就是因為要用e把出棧前的棧頂元素的值帶回來。資料結構課程棧出棧入棧問題 題目中沒有給出push pop兩個函式的實現 猜測出題者的本意,應該是入棧和出棧過程中版順便給對應權變數賦值,據此,答案如下 最初x c y k push s,x c入棧,棧中只有c push s,...

關於用c語言寫的入棧和出棧程式,棧操作的問題

嗯,是你這樣理解,書上錯了 78,79行應改成top top next free p1 c語言 進棧和出棧 閒得沒事幹,跟你詳細講講吧。首先要弄明白一點,棧的結構是 先進後出 的,就像你堆積木一樣,第一根放在最底層的地面上,然後一根一根往上堆。前乙個放上去的總是被後乙個放上去的壓在底下。那我當我再想...

java初學菜鳥求大神告知何謂壓棧和彈棧謝謝

其實,這不是乙個java問題,這是乙個資料結構的問題。請看下邊的部落格,比我簡略的回答好上一萬倍。http 壓棧和彈棧的工作過程 棧就像個桶一樣,壓棧就是往桶裡面放東西,彈棧就是從桶裡面拿東西。棧的工作原理是先進後出,後進先出。實現的時候,有個指標指向棧頂,壓棧的時候,指標上移,把東西放進去,彈棧的...