堆棧段在實模式和保護模式下的工作方式相同,下面我們隻介紹在實模式下的工作方式:
其中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的内容不變。