《匯編語言》王爽,學(xué)習(xí)筆記(棧)

想必有過學(xué)習(xí)編程語言經(jīng)歷的人,對棧這個詞絲毫不會感到陌生,棧也是8086時代所誕生的一種具有特殊的訪問方式的存儲空間。

1.棧的概念

棧其實也是一段內(nèi)存段,和別的內(nèi)存段沒有任何區(qū)別,都是線性的,只是CPU對棧做出了一點特殊的操作,CPU用SS:SP指向了棧頂,也就是說,無論何時SS:SP這個地址都是棧頂?shù)牡刂?,這也就為棧的操作方式提出了限制,LIFO(Last In First Out,先進(jìn)后出)。

你將數(shù)據(jù)入棧,就是將SS:SP的指向向上移動了兩個字節(jié),然后寫入數(shù)據(jù),這樣新入棧的數(shù)據(jù)也就變成了棧頂,同理出棧也是類似的操作,首先將SS:SP的指向向下移動兩個字節(jié),然后彈出數(shù)據(jù),這樣原始數(shù)據(jù)就不再是棧頂了,也就是被變相的刪除了(還存在原地址,只是不屬于棧)。

注意,對于CPU來說,并沒有棧這個概念,這個只是程序員為了編程方便而發(fā)明的一種數(shù)據(jù)結(jié)構(gòu),是存在人的意識之中的,也就是說,棧的大小,CPU并不知道,他只知道SS:SP指向的就是棧頂,在程序中控制棧大小,防止溢出也就是程序員的責(zé)任了。

2.PUSH,POP指令

為了對棧的操作方便,CPU提供了PUSH,POP兩個指令來以棧的方式來訪問內(nèi)存空間。

PUSH AX????????????? ;將AX中的值入棧

POP AX??????????????? ;將棧頂元素的值賦值給AX

PUSH指令的實質(zhì)就是SP = SP - 2,然后向SS:SP中寫入數(shù)據(jù),同理POP指令的實質(zhì)就是讀取SS:SP中的數(shù)據(jù),然后SP = SP + 2。

注:對于棧來說,首先是向高地址寫入數(shù)據(jù),然后逐個向低地址寫入,所以PUSH是SP-2(向上移動)。

前面說道了SS:SP時時刻刻都是指向棧頂?shù)牡刂?,那么怎么表示這個??臻g沒有存在任何內(nèi)容?那么就是將SP的值指向??臻g最高地址(形象來說就是杯子的最底部)的下一個地址,這樣就表示這個是個空棧。

3.用途

介紹了棧的性質(zhì),那么棧到底有什么用處,要使得CPU專門為他來設(shè)計匯編指令?

個人看法:

首先,我們知道通用寄存器的個數(shù)是有限的,那么我們?nèi)绾卧诟呒壵Z言中使用超過寄存器個數(shù)的數(shù)據(jù)?相信深入學(xué)習(xí)過編程語言的人都了解,在程序中聲明自由的變量都是存貯在棧中的,棧這就為了多數(shù)據(jù)使用提供了實現(xiàn)。

其次,我們之前說過程序是將CS:IP指向的地址當(dāng)作是代碼來執(zhí)行,那么回憶一下高級語言中的函數(shù),我們怎么調(diào)用一個函數(shù)?

在主函數(shù)調(diào)用他的子函數(shù)之時,是將CPU的控制權(quán)交給子函數(shù),然后在子函數(shù)完成工作之后再將控制權(quán)返回給主函數(shù)。那么仔細(xì)想想,我們在匯編中調(diào)用一個子函數(shù)是很簡單的,只需要將CS:IP指向他就可以,那么返回呢?

這時候就是棧大顯生手的時候了,在匯編中調(diào)用子函數(shù)的全過程就是首先將標(biāo)志寄存器(之后會介紹)入棧,然后將當(dāng)前的CS:IP入棧,最后JMP(之后會介紹)子函數(shù)地址,在返回時就對應(yīng)POP數(shù)據(jù)就可以了。

最后,有沒有記得一開始提到寄存器的時候我說明了CX這個寄存器和循環(huán)(之后會介紹)有關(guān)系?是的,CPU就是根據(jù)CX寄存器的值來判斷循環(huán)的,那么思考一下,高級語言中的嵌套循環(huán)是怎么實現(xiàn)的?

是不是發(fā)現(xiàn)兩個循環(huán)都需要改變CX的值?那么循環(huán)次數(shù)不都亂套了嗎,這是對應(yīng)的處理方式就是在進(jìn)入子循環(huán)的之后現(xiàn)將當(dāng)前的CX入棧,在子循環(huán)結(jié)束時將CX值POP回去,繼續(xù)控制外層循環(huán)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容