首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >装配中的EBP、ESP和堆栈框架

装配中的EBP、ESP和堆栈框架
EN

Stack Overflow用户
提问于 2013-01-06 18:34:37
回答 1查看 10.1K关注 0票数 8

在下面的代码中,我有一些关于EBP、ESP和堆栈框架的问题。

  1. 为什么我们从esp中减去28?我们主要有两个局部变量x和y。那我们为什么不减去8呢?
  2. 难道我们不把值从右(或上)堆到左(或底)吗?那么,为什么我们将1添加到eax+8而不是eax+4?
代码语言:javascript
代码运行次数:0
运行
复制
func(int a, int b, int c)
{
  return a+b+c;
}
main()
{
 int x, y=3;
 x=func(y,2,1);
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-06 19:11:46

  1. 堆栈指针被减去28,因为两个局部变量需要8个字节,参数需要12个字节才能发挥作用。额外的8个字节可能是因为编译器试图将main的堆栈对齐到一个16字节的边界(main的返回地址在堆栈上已经有4个字节,当EBP被推入main的第一条指令中建立堆栈帧时,另外还有4个字节)。如果你在使用GCC,请看-优选-堆栈-边界
  2. 参数正从右向左传递。由于在从堆栈指针中减去堆栈空间时,已经为这三个参数分配了堆栈空间,因此相对于当前堆栈指针(+8),1被移动到“最高”位置,2被移动到中间(+4),y中的值被移动到堆栈指针本身。这与在堆栈上推1、在堆栈上按2、然后在堆栈上推y是一样的。到最后一次推送指令时,1是ESP +8,2 is +4来自ESP,y +0来自ESP。请注意,在func内部,它必须将8添加到这些偏移量中,因为返回地址是从调用指令推送到堆栈上的,而func推送EBP以建立堆栈框架。
  3. 搞不清楚是什么结构?
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14185381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档