《自己動手寫作業系統》讀後感 http://blog.csdn.net/zgh1988/article/details/7059936
全面剖析《自己動手寫作業系統》第一章 http://blog.csdn.net/zgh1988/article/details/7060032
全面剖析《自己動手寫作業系統》第二章 http://blog.csdn.net/zgh1988/article/details/7062065
全面剖析《自己動手寫作業系統》第三章1 http://blog.csdn.net/zgh1988/article/details/7098981
全面剖析《自己動手寫作業系統》--“實模式--保護模式--實模式”
http://write.blog.csdn.net/postedit/7256254
堆棧段在實模式和保護模式下的工作方式相同,下面我們只介紹在實模式下的工作方式:
其中SS 堆棧段寄存器,用來儲存堆棧段的初始地址;
SP 堆棧指標寄存器,用來儲存堆棧段的棧頂位移量。
堆棧段初始化的工作如下:
SS定位到堆棧段的起始地址(基地址,低地址),棧底位於堆棧段的有效地址的最末端(高地址)。SP初始化為堆棧段的大小,SS:SP永遠指向堆棧的棧頂。在初始化時,SS:SP指向堆棧段的最高地址(此時,棧底和棧頂都指向這一記憶體位址)。隨著壓入元素,SP不斷變小,進而SS:SP代表的棧頂地址變小,不在等於棧底地址,而是逐漸靠近堆棧段的起始地址,當SP為0時,SS:SP代表的棧頂地址與SS:0000代表的堆棧段的起始地址相等,進而確定棧滿,CPU也是通過判斷SP
<0來檢驗堆棧是否溢出的。
使用該堆棧段,執行下面一段代碼:
mov ax,1234H
push ax
從這裡我們可以更清楚的看出來,SS指向的是堆棧段的起始地址,SS:SP指向的是棧頂,棧底為高地址。
為了更清楚的理解堆棧段的工作方式,現在我們來看下面的題目:
如果一個堆棧從地址3250H:0000H開始,它的最後一個字的位移地址為0100H,SP的內容為0052H,問:
1 棧頂地址是什麼?
2 棧底地址是什麼?
3 存入資料1234H和5678H後,SP的內容是多少?
答案:
1 堆棧的最高地址叫棧底,堆棧指標SP總是指向棧頂。
棧頂地址=(SS) × 10H + (SP)=3250H × 10H + 0052H=32552H
2 棧底地址=(SS) × 10H + 0100H = 32600H
3 8086CPU中堆棧存取必須以字為單位。存入資料1234H和5678H後,即兩個字壓入堆棧後,SP減4,SP的內容為:
(SP) - 字數 × 2=0052H - 2 × 2=004EH。SS的內容不變。