天天看點

《一個作業系統的實作》讀書筆記--第三章--堆棧段的工作方式

堆棧段在實模式和保護模式下的工作方式相同,下面我們隻介紹在實模式下的工作方式:

其中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的内容不變。

《一個作業系統的實作》讀書筆記--第三章--堆棧段的工作方式
《一個作業系統的實作》讀書筆記--第三章--堆棧段的工作方式

繼續閱讀