[CSAPP学习笔记] 栈帧

CSAPP第三章的重点在我看来就集中在对栈帧的理解上了。IA32过程调用就是通过各种栈帧来实现的。

 

栈帧(Stack Frame):为单个过程(Procedure)分配的那部分栈。

因此栈帧存在于栈上,每个过程又各自拥有自己独自的栈帧。栈帧以两个指针定界:栈指针%esp寄存器和帧指针%ebp寄存器,%esp在执行时需要不停移动,因此信息一般是靠单个过程中固定不变的帧指针%ebp来访问。下图是一个典型的栈帧结构(注意栈结构是地址向下增长的):

假设调用帧(Caller’sframe)为过程P的栈帧结构,而当前帧(Currentframe)为所调用的过程Q的栈帧结构。

由图中可以看出,在调用Q之前,P要把传递给过程Q的参数Argument1到Argument n按照地址增长的顺序存放(注意此时帧指针%esp指向Argument1)。

一旦执行call 指令调用过程Q,返回地址会被立即压入栈中(注意push指令会将减少%esp的值)。

而在开始执行Q过程前,要把P的帧指针%ebp保存起来(这样从Q返回之后才能找到P栈帧的位置),然后把%esp栈指针赋值给%ebp,让帧指针%ebp指向这个新栈帧的帧底,接着减小栈指针%esp的值使其指向新栈帧的帧顶,过程Q的栈帧空间也就分配好了。

这些空间还可以用来保存Q过程中一些局部变量࿰

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值