棧是電腦科學最重要的的資料結構
從技術上說,棧就是cpu暫存器裡的某個指標所指向的一片記憶體區域。這裡所說的"某個指標"通常位於x86/x64平台的esp或者rsp暫存器
操作棧最常用的製造令是push和pop,push指令會對esp/rsp/sp暫存器的值進行減法運算,使之減去4或者8,然後將運算元寫到暫存器裡的指標所指向的記憶體中
pop指令則是push指令的逆操作,它先從棧指標指向的記憶體中讀取資料,通常是寫到其他暫存器裡,然後再講棧指標加上4或者8
多數棧都是逆向生長的,當然這是乙個歷史原因。
call指令等價於
push 返回位址
jmp 函式位址
被呼叫函式裡的ret指令,會從棧中讀取返回位址,然後跳轉到這個位址,就相當於
pop 返回位址
jmp 返回位址
int
test
(int a,
int b,
int c)
push c
push b
push a
call test
...
在引數處理方面沒有相關的硬性規定
我們可以使用棧來傳遞引數,也可以不使用棧來傳遞引數
被呼叫函式並不知道外部向它傳遞了多少個引數。如果函式的引數數量可變,它就需要說明符(多數以%號開頭)進行格式化說明、明確引數資訊
printf
("%d %d %d"
,666
);
這個函式不僅會讓printf顯示1234,而且還會讓它顯示資料棧內1234之後的兩個位址隨機數
當函式退出後,原有棧空間裡的區域性變數不會被自動清除,它們就成了棧上的髒資料。
也就是說每乙個函式開闢的堆疊空間上,可能會存在上一次使用這塊記憶體的程式的資料,然而上乙個程式可能已經結束執行了,但是它的棧上資料依然被保留在記憶體上。
由於清除棧上的資料開銷很大,所以一般當程式執行程式結束後都是沒有進行處理的。
什麼是堆?什麼是棧?
一 英文名稱 堆和棧是c c 程式設計中經常遇到的兩個基本概念。先看一下它們的英文表示 堆 heap 棧 stack 二 從資料結構和系統兩個層次理解 在具體的c c 程式設計框架中,這兩個概念並不是並行的。深入到彙編級進行研究就會發現,棧是機器系統提供的資料結構,而堆 是由c c 函式庫提供的。這...
什麼是堆?什麼是棧?
一 英文名稱 堆和棧是c c 程式設計中經常遇到的兩個基本概念。先看一下它們的英文表示 堆 heap 棧 stack 二 從資料結構和系統兩個層次理解 在具體的c c 程式設計框架中,這兩個概念並不是並行的。深入到彙編級進行研究就會發現,棧是機器系統提供的資料結構,而堆是由c c 函式庫提供的。這兩...
什麼是記憶體
www.armjishu.com整理 1.什麼是記憶體 什麼是記憶體呢?在計算機的組成結構中,有乙個很重要的部分,就是儲存器。儲存器是用來儲存程式和資料的部件,對於計算機來說,有了儲存器,才有記憶功能,才能保證正常工作。儲存器的種類很多,按其用途可分為主儲存器和輔助儲存器,主儲存器又稱記憶體儲器 簡...