此篇文章是對應(yīng)8086系統(tǒng)蛤育,有出入請自查。
棧-stack 通過字義就可以感覺出來,這玩意就像客棧一樣恒界。是臨時儲存和交換數(shù)據(jù)
用的桨啃。
介紹內(nèi)存
談輪棧之前车胡。咱們還得先熟悉一個東東。
它就是內(nèi)存照瘾。
毋容置疑匈棘。這貨就是咱們常說的內(nèi)存(Ram)。
每一塊內(nèi)存的位置都是對應(yīng)一個內(nèi)存地址析命。
一般這個地址都是用16進(jìn)制來表達(dá)的主卫。
0x400H 這就是一個內(nèi)存地址
每一個內(nèi)存儲存兩個bit(01)
1字 = 8字節(jié) = 16bit
內(nèi)存就好比是一段路。這個路上用很多電線桿鹃愤。
每個電線桿就是一個內(nèi)存地址簇搅。我們要取出這個電線桿附近的數(shù)據(jù)。
就需要把地址指向這里软吐。
現(xiàn)在說說地址瘩将。
一般地址都是采用方式:段地址 * 16 + 偏移地址
雖然現(xiàn)在的cpu已經(jīng)不是16位。但是偏移地址這個還是尋址使用的手段凹耙。
咱們說說短地址為什么乘以16鸟蟹。
比如咱們小區(qū)。用一棟樓號牌 是200.使兔。
這時候有個人來找這棟樓建钥。但是他每次是能發(fā)出兩個字。
要不是20 虐沥,要不是00熊经。咱們要告訴保安找那棟樓怎么辦呢。
接下來就是見證奇跡的時刻
乘法:咱們先說20 然后 說x欲险,然后說10镐依。
20 x 10 = 200.
雖然這樣說不夠確切。但是可以更好的解釋天试。
8086的cpu只有16根信號線槐壳。所以每次只能發(fā)送16位。超過這個就會被過濾掉多余的信號喜每。
如果咱們?nèi)?7位的數(shù)據(jù)务唐。這個17就會丟失掉雳攘。
聰明的大神就領(lǐng)悟到了這個神圣的乘法。
雖然咱們的cpu已經(jīng)64位了枫笛。
但是這個老傳統(tǒng)并沒有取締吨灭。這個方式也可以更好的保護(hù)數(shù)據(jù)。不被直接查看的刑巧。
咱們再來聊一聊偏移地址:
還是那個小區(qū)喧兄。
還是那位只能發(fā)兩個字的先生。他這次來要找202啊楚。
這次怎么辦呢:
他需要這么做:
先說20 然后 x 吠冤,然后 10 ,然后 + 恭理,然后02咨演。
20 x 10 + 2 = 202
這個200就是咱們的物理地址。
咱們cpu尋找數(shù)據(jù)并不是直接修改物理地址蚯斯。
他每次修改的事偏移地址薄风。也就是大家常說的ip(這個不是互聯(lián)網(wǎng)的那個撒)
他要找205偏移地址就是5。
這個是cpu來自動計算的拍嵌。咱們了解就好遭赂。不用太刻意。
通過以上解釋横辆。得到的結(jié)論就是儲存4個bit就需要兩個內(nèi)存地址撇他。
接下來咱們來看棧的指令。
push 入棧 : 添加數(shù)據(jù)
pop 出棧 : 取出數(shù)據(jù)
棧的儲存方式是先入后出狈蚤,先存進(jìn)去的最后出來困肩。
說到取數(shù)據(jù)。咱們肯定要想到一個就是寄存器脆侮。
ss寄存器就是表達(dá)咱們的棧的
sp就是咱們的棧頂锌畸。指到哪里就在哪里開始儲存數(shù)據(jù)。
既然起了個棧這么吊炸天的名字靖避√对妫肯定不能和其他寄存器一樣。
他的儲存方式就是不同幻捏。他是從高地址往低地址儲存的盆犁。
寄存器介紹
普通的寄存器都是從低到高的。
咱們舉個例子吧:
還是那個小區(qū)篡九,它的名字叫做棧谐岁。
它有十棟樓房。
1,2伊佃,3 ····窜司,9,10
有人買房子。這個銷售只能從第十棟開始出售锭魔。
然后出售第九棟例证。
這個就是push操作路呜。
反之迷捧。如果有人想出售房子。
就得從第一棟開始胀葱。你不能插隊漠秋。先買的最后才能賣。
這個就是pop操作抵屿。
接下來來一段代碼:
mov ax,1000H; 賦值給ax寄存器
mov ss,ax ;指定ss棧寄存器地址
mov ax,1006H ; 賦值給ax寄存器
mov sp,ax ;開辟一個棧庆锦。空間地址為1000 - 1006
mov ax,8888H; 賦值是ax寄存器
push ax ;賦值給棧
pop bx ;取出第一個值賦值給bx
最后說明
mov是賦值指令轧葛。
在匯編里面不可以直接給寄存器指定地址搂抒。
必須通過給段內(nèi)存賦值然后執(zhí)行此地址即可。
ss地址可以理解為結(jié)束地址尿扯。因為棧是從高往低儲存求晶。如果你這個地址
高于sp地址(棧頂)內(nèi)存就會出現(xiàn)泄漏。這個比較危險衷笋。
通俗來講:
起始地址(ss) - 結(jié)束地址(sp)
但是sp是移動的芳杏。每增加數(shù)據(jù)就會移動一次。
超過sp或低于ss都會內(nèi)存泄漏辟宗。
再強(qiáng)調(diào)一下:棧是從高往低儲存爵赵。
有哪里不足的地方希望補(bǔ)充下。