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

转载 2016年08月30日 22:18:49
堆栈段在实模式和保护模式下的工作方式相同,下面我们只介绍在实模式下的工作方式:
其中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的内容不变。


数据段、代码段、堆栈段、BSS段的区别

5个数据段        进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是...
  • jxhui23
  • jxhui23
  • 2012年10月12日 15:25
  • 39822

内存空间分几部分:代码段、数据段,栈,堆 (收集整理)

1.函数代码存放在代码段。声明的类如果从未使用,则在编译时,会优化掉,其成员函数不占代码段空间。 全局变量或静态变量,放在数据段, 局部变量放在栈中, 用new产生的对象放在堆中, 内...

关于河南省第七届ACM大学生程序设计竞赛的总结

今年的省赛是我参加的第一次省赛

Nginx源代码分析之群惊问题(十七)

接上一节,在accept初始化的时候有一个ngx_use_accept_mutex变量,这是用来解决当多个进程在一个套接口上同时调用accept引起的群惊问题的。...
  • namelcx
  • namelcx
  • 2016年09月01日 17:26
  • 396

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

堆栈段在实模式和保护模式下的工作方式相同,下面我们只介绍在实模式下的工作方式: 其中SS 堆栈段寄存器,用来存储堆栈段的初始地址;SP 堆栈指针寄存器,用来存储堆栈段的栈顶偏移量。 堆栈段初始化的...
  • bfboys
  • bfboys
  • 2016年09月03日 11:48
  • 447

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

堆栈段在实模式和保护模式下的工作方式相同,下面我们只介绍在实模式下的工作方式: 其中SS 堆栈段寄存器,用来存储堆栈段的初始地址;SP 堆栈指针寄存器,用来存储堆栈段的栈顶偏移量。 堆栈段初始化的工作...
  • zgh1988
  • zgh1988
  • 2012年02月13日 21:46
  • 5127

堆栈段工作原理演示

  • 2012年04月27日 15:44
  • 8KB
  • 下载

ARM支持的4种堆栈工作方式

1.满递增堆栈:堆栈指针指向最后压入堆栈的数据,且由低地址向高地址生成 2.满递减堆栈:堆栈指针指向最后压入堆栈的数据,且由高地址向低地址生成 3.空递增堆栈:堆栈指针指向下一个要放入数据...

浅谈C#堆栈与托管堆的工作方式

好文, 对C#加深理解. 转:http://www.haogongju.net/art/1394761 C#初学者经常被问的几道辨析题,值类型与引用类型,装箱与拆箱,堆栈,这几个概念组合之间区别,看...

c++内存分配方式,堆栈区别,堆栈段,数据段,代码段,附加段

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参...
  • mfcing
  • mfcing
  • 2014年06月19日 11:08
  • 1122
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第三章--堆栈段的工作方式
举报原因:
原因补充:

(最多只允许输入30个字)