积极的EBP参考的目的是什么?

问题描述:

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

+0

ebp + offset用于引用函数变量 –

+0

函数变量是什么意思?我想这取决于调用约定,但我的理解是参数要么被压入堆栈(因此是否定参考)),要么存储在注册表中。 –

+2

如果你在你的函数开始处执行其他任何操作之前运行'push ebp' /'mov ebp,esp',那么'[ebp + 4]'将保存'call'指令所推送的返回地址。 '[ebp + 8]'是第一个(非寄存器)* arg * /参数。 (不是本地变量) –

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

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

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

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

在函数返回之前,ESP被重新设置为EBP,然后栈被解开。

+0

谢谢!关于EBP何时设立,我有一个误解。 –

+1

'ebp-offset'用于局部变量,'ebp + offset'用于参数。 (另一种方法)。 esp递减(减)以为局部变量创建空间。堆栈“向下增长”。 OP实际上在他的问题中理解得很清楚,他只是没有意识到“外部”是在调用其代码之前存储到堆栈中的值(调用参数)。 @JacobPersi – Ped7g