匯編語言 - 棧
棧是一塊特殊的內(nèi)存空間,本文涉及的CPU為8086CPU,所有與內(nèi)存地址有關的數(shù)字皆為16進制
前言
棧的運行規(guī)律 - 先進后出,后進先出
以下為入棧的過程:
以下是出棧的過程:
以上就是棧的運行機制,棧的入棧叫做push,出棧叫做pop
在8086CPU中,棧是一塊特殊的內(nèi)存空間,棧的出棧和入棧都是以字為單位的
1. 8086棧機制
8086使用一段內(nèi)存對棧進行模擬,最基本的操作是pop(出棧)和push(入棧)
- pop 寄存器 : 表示將棧頂元素出棧并且將數(shù)據(jù)送入寄存器中
- push 寄存器: 表示將寄存器中的元素入棧
下面是一段當作棧區(qū)使用的內(nèi)存空間,初始化如下:
執(zhí)行指令:push AX后:
寄存器AX中的內(nèi)容被存放進內(nèi)存中,棧頂指針上移兩個字節(jié)
執(zhí)行指令 push BX 后:
寄存器BX中的內(nèi)容被存放進內(nèi)存中,棧頂指針上移兩個字節(jié)
執(zhí)行指令pop CX中:
將棧頂元素送入CX后,棧頂指針下移兩個字節(jié)
我們只需要使用pop和push指令,就可以對這段內(nèi)存空間按照先進先出的規(guī)則進行訪問,那么CPU怎么知道這段空間就是棧空間呢?
2. SS和SP寄存器
CPU是怎么知道我們執(zhí)行的指令的地址?CPU是怎么知道我們執(zhí)行指令的時候需要的數(shù)據(jù)的地址的?CPU通過CS:IP寄存器確定指令的位置,CPU通過DS:[address]確認數(shù)據(jù)的位置,那么需要確定棧頂?shù)奈恢?,也需要添加寄存器,SS與SP寄存器就是用來確定棧頂?shù)奈恢玫摹?/p>
SS寄存器中存著棧頂?shù)亩蔚刂?,SP寄存器中存放著偏移地址,通過這兩個寄存器中的值就可以判斷棧頂?shù)奈恢谩?/p>
2.1 push指令與pop指令
push指令的完成,需要以下兩個步驟
- SP = SP - 2:因為SS:SP指向前棧頂,既然需要push 數(shù)據(jù),自然需要獲取新棧頂
- 將 push 后面跟的寄存器中的內(nèi)容寫入剛開辟出的內(nèi)存中,此時的SS:SP指向新棧頂
入棧時,棧頂從高地址向低地址增長
pop指令的完成,需要以下兩個步驟
- 將棧頂元素送入pop后面跟的寄存器中
- SP = SP + 2,SS:SP指向下一個元素
出棧時,棧頂從低地址向高地址增長
2.2 示例
測試初始空間如下:
圖中的棧頂SS:IP應為 SS:SP
當前SS:SP指向1000:A
執(zhí)行push AX 指令后:
棧頂指針先上移,SP = SP - 2,然后將AX中的數(shù)據(jù)寫入棧頂
執(zhí)行push BX指令后:
棧頂指針先上移,SP = SP - 2,然后將BX中的數(shù)據(jù)寫入棧頂
執(zhí)行pop AX指令后:
先將棧頂中的數(shù)據(jù)寫入AX中,然后棧頂指針下移,SP=SP + 2
執(zhí)行pop BX指令后:
先將棧頂?shù)臄?shù)據(jù)寫入BX中,然后棧頂指針下移,SP = SP + 2
如果1000:0 到 1000:F 這塊內(nèi)存是棧空間,并且初始狀態(tài)???,那么初始狀態(tài)下棧頂指針應指向1001:0,也就是第一次PUSH時棧頂指針剛好能夠減到1000:E
2.3 越界問題
因為8086CPU只提供了棧頂寄存器,如果劃分了一段內(nèi)存空間為棧空間,例如1000:0 到 1000:F,如果SS:SP指針通過一系列的push和pop操作超出了這個范圍,出現(xiàn)了上溢或者下溢的問題,是沒有辦法解決的,因為8086CPU 并沒有提供對應的寄存器存放??臻g的大小,不能在每次push和pop操作之前先判斷是否越界。
只能通過自己編程的時候避免。
3. debug測試
3.1 例題
利用棧的功能交換兩個寄存器中的內(nèi)容
寄存器和內(nèi)存初始化
將AX壓棧:
將BX壓棧:
將棧頂pop到AX中:
將棧頂pop到BX中
完成兩個寄存器中的內(nèi)容交換文章來源:http://www.zghlxwxcb.cn/news/detail-400496.html
3.2 在debug中進行測試
- 先將AX和BX中的內(nèi)容設置為1234H和5678H,然后找好棧區(qū)
- 寫入對應的代碼
- 將CS:IP指向?qū)拇a處,則開始運行程序
執(zhí)行完代碼后成功交換寄存器中的值文章來源地址http://www.zghlxwxcb.cn/news/detail-400496.html
到了這里,關于【匯編語言】棧區(qū)與SS:SP寄存器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!