我是靠谱客的博主 矮小绿草,最近开发中收集的这篇文章主要介绍堆栈段,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1  介绍

堆栈段(stacksegment)通常是指采用堆栈方式工作的一段内存区域。当程序被执行时,程序可能会将其执行的状态加入栈的顶部;当程序结束时,它必须把栈顶的状态数据弹出(pop)。

 

2  存储形式

      ebp是栈底寄存器

       esp是栈顶寄存器

       每4字节的栈空间保存一个数据,当esp小于ebp时,就形成了栈帧

 

3  使用指令

       push:压栈操作,把数据写入到esp执行的堆栈上,然后esp减4

       pop:出栈操作,从esp执行的地址上获取一个数据,然后esp加4

       读取堆栈内容:有两种寻址方式,ebp寻址(以ebp为基准的变量地址表示方式)和esp寻址(以esp为基准的变量地址表示方式)

4  用途

在采用段式内存管理方式进行程序内存分配的架构中,堆栈段用来存放局部变量和函数返回地址。

理论上,最小的栈可能是一个仅能保存函数调用(function call) 地址的结构,以致被调用的函数能根据该地址返回(return)到原函数里。除此功能以外,开发者也可以将栈另作他用。

 

5  使用方式

堆栈段是在程序运行时动态分配使用,只需要通过栈顶指针即可访问。目前大多数CPU中都有专用寄存器可以被用来存放栈顶地址。  

     5.1  生成栈帧

              pushebp            ;保存前面函数的栈底到当前的栈上

              movebp, esp     ;以前面函数的栈顶作为当前函数的栈底

                                          ;也作为保存前一个函数的栈顶到ebp寄存器

              subesp , [xx]h   ;设置新的栈顶,分配一定大小的栈空间

 

     5.2  关闭栈帧

              addesp , [xx]h   ;恢复栈顶,释放栈空间

              movesp , ebp    ;恢复上一个函数的栈顶

              popebp                     ;恢复上一个函数的栈底

 

     5.3  寄存器环境保存和恢复

              pushebx

              pushesi

              pushedi

              ......

              popedi

              popesi

              popebx

6  特点

基于栈的内存分配法的特点就是,当程序结束时,栈所用的内存能够自动快速地被回收,开发者不用干预,省心省力。如果栈顶的数据需要以某种格式被保存起来,那么在程序结束前,此数据必须被复制到其他位置,不然就会被弹出栈而丢失。因此,基于栈的内存分配法适用于那些只需暂时数据的保存情况。

x86处理器系列对线程栈的管理有特殊的指令。其他处理器系列(包括PowerPC 和 MIP)则没有这种支持。

操作系统给线程分配的栈可能仅为几个KB的大小。如果分配的栈内存过大,超过了线程实际需要,这可能导致栈溢出(stack overflow),以致系统崩溃。

 

 

 

 

最后

以上就是矮小绿草为你收集整理的堆栈段的全部内容,希望文章能够帮你解决堆栈段所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部