《一个操作系统的实现》读书笔记--第三章--堆栈段的工作方式

堆栈段在实模式和保护模式下的工作方式相同,下面我们只介绍在实模式下的工作方式:
其中SS 堆栈段寄存器,用来存储堆栈段的初始地址;SP 堆栈指针寄存器,用来存储堆栈段的栈顶偏移量。
堆栈段初始化的工作如下:

《一个操作系统的实现》读书笔记--第三章--堆栈段的工作方式_第1张图片 

SS定位到堆栈段的起始地址(基地址,低地址),栈底位于堆栈段的有效地址的最末端(高地址)。SP初始化为堆栈段的大小,SS:SP永远指向堆栈的栈顶。在初始化时,SS:SP指向堆栈段的最高地址(此时,栈底和栈顶都指向这一内存地址)。随着压入元素,SP不断变小,进而SS:SP代表的栈顶地址变小,不在等于栈底地址,而是逐渐靠近堆栈段的起始地址,当SP为0时,SS:SP代表的栈顶地址与SS:0000代表的堆栈段的起始地址相等,进而确定栈满,CPU也是通过判断SP <0来检验堆栈是否溢出的。

使用该堆栈段,执行下面一段代码:
mov ax,1234H
push ax

《一个操作系统的实现》读书笔记--第三章--堆栈段的工作方式_第2张图片

从这里我们可以更清楚的看出来,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的内容不变。


《一个操作系统的实现》读书笔记--第三章--堆栈段的工作方式_第3张图片

《一个操作系统的实现》读书笔记--第三章--堆栈段的工作方式_第4张图片

你可能感兴趣的:(保护模式,一个操作系统的实现,实模式,堆栈段)