第三章--堆栈段的工作方式
其中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的內容不變。
總結
以上是生活随笔為你收集整理的第三章--堆栈段的工作方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “实模式--保护模式--实模式”转换过程
- 下一篇: 第五章--加载内核Kernel.bin