关闭

第三章--堆栈段的工作方式

294人阅读 评论(0) 收藏 举报
分类:
堆栈段在实模式和保护模式下的工作方式相同,下面我们只介绍在实模式下的工作方式:
其中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的内容不变。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:612403次
    • 积分:11880
    • 等级:
    • 排名:第1244名
    • 原创:288篇
    • 转载:1964篇
    • 译文:3篇
    • 评论:10条
    最新评论