tarius.wu

Spend more time with your family and friends, eat your favorite foods, visit the places you love.
posts - 4, comments - 58, trackbacks - 0, articles - 10
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

栈指针和帧指针

Posted on 2006-11-29 19:55 tarius.wu's Blog 阅读(5553) 评论(0)  编辑 收藏 引用 所属分类: Embedded system

一般来说,大家对堆和栈比较熟悉,而对于计算机体系结构中帧(frame)的概念可能不是那么清楚,本文对栈帧的概念试图做出解释,欢迎更深入的讨论.

栈操作

程序栈放在存储器中的某个区域,在UNIX style计算机中,栈向下增长.pushl和popl指令都只有一个操作数--用于压入的原数据和用于弹出的目的数据.栈指针%esp保存着当前最后被压入栈的元素地址,因此要想将一个双字压入栈中,首先要将栈指针减4,然后将值写到新的栈指针指向的地址.因此指令pushl %eax的行为等价于下面这两条指令:

  • subl $4, %esp
  • movl %eax, (%esp)

同理,弹出一个双字的操作过程是首先从栈指针%esp指向的栈地址读出数据,然后将栈指针加4.

 

上图是堆栈的操作说明,按照惯例,栈是倒过来画的,因而栈底在上面,栈往低地址方向生长.

过程调用和栈帧结构

一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分.另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间.

大多数机器数据传递,局部变量的分配和释放是通过操纵程序栈来实现的.栈用来传递过程参数,存储返回信息,保存寄存器以供以后恢复之用,以及用于本地存储.为单个过程分配的那部分栈称为栈帧(stack frame),也就是说,栈帧是相对过程调用而言的,一个子程序有一个栈帧,而栈是属于整个计算机系统的.下图描绘了栈帧的通用结构.栈帧的边界以两个指针界定,寄存器%ebp为帧指针,而寄存器%esp为栈指针.当程序执行时,栈指针时可以移动的,因此大多数的访问信息都是相对于帧指针.

 

假设过程P(调用者)调用过程Q(被调用者).Q的参数放在P的栈帧中,另外,当P调用Q时,P中的返回地址被压入栈中,形成P的栈帧的末尾.返回地址就是当程序从Q返回时应继续执行的地方.Q的栈帧从保存的帧指针的值开始,后面是保存的其他寄存器的值.

只有注册用户登录后才能发表评论。