【问题标题】:What is the purpose of positive EBP referencing?正 EBP 参考的目的是什么?
【发布时间】:2018-03-31 22:52:29
【问题描述】:

如果堆栈向下增长,并且 EBP 指向堆栈的底部,那么为什么我会看到 mov eax [ebp + 4] 这样的操作。这不会引用当前堆栈框架之外的变量吗?

【问题讨论】:

  • ebp + offset 用于引用函数变量
  • 函数变量是什么意思?我想这取决于调用约定,但我的理解是参数要么被推入堆栈(因此是负引用]),要么存储在注册表中。
  • 如果您在函数开始处推送其他任何内容之前运行push ebp / mov ebp, esp,则[ebp+4] 将保存由call 指令推送的返回地址。 [ebp + 8] 是第一个(非注册)arg / 参数。 (不是局部变量)

标签: assembly x86 stack


【解决方案1】:

在调用函数之前,参数被压入堆栈。

在函数开始时,EBP 以及任何其他需要保存的寄存器被压入,然后将 EBP 设置为等于 ESP。

如果在函数中声明了变量,例如 C 自动变量,ESP 会递减以在 EBP 和 ESP 之间留出空间来保存这些变量。

所以EBP+offset 用于参数,EBP-offset 用于局部变量。

在函数返回之前,ESP 被设置回 EBP,然后堆栈被展开。

【讨论】:

  • 谢谢!我对 EBP 的设置时间有误解。
  • ebp-offset 用于局部变量,ebp+offset 用于参数。 (另一种方法)。并且 esp 被递减(减去)以为局部变量创造空间。堆栈向下“增长”。 OP实际上在他的问题中很好地理解了它,他只是没有意识到“外部”是在调用他的代码(调用参数)之前存储到堆栈中的值。 @JacobPersi
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2018-07-17
  • 2012-11-28
  • 2012-04-03
  • 1970-01-01
  • 2016-02-21
  • 2013-02-07
相关资源
最近更新 更多