积极的EBP参考的目的是什么?
答
在函数被调用之前,参数被压入堆栈。
在函数的开始处,EBP被压入以及需要保存的任何其他寄存器,然后EBP被设置为等于ESP。
如果在函数中声明了一些变量,例如C自动变量,则ESP会递减以在EBP和ESP之间留出空间来容纳这些变量。
所以EBP+offset
用于参数和EBP-offset
用于局部变量。
在函数返回之前,ESP被重新设置为EBP,然后栈被解开。
+0
谢谢!关于EBP何时设立,我有一个误解。 –
+1
'ebp-offset'用于局部变量,'ebp + offset'用于参数。 (另一种方法)。 esp递减(减)以为局部变量创建空间。堆栈“向下增长”。 OP实际上在他的问题中理解得很清楚,他只是没有意识到“外部”是在调用其代码之前存储到堆栈中的值(调用参数)。 @JacobPersi – Ped7g
ebp + offset用于引用函数变量 –
函数变量是什么意思?我想这取决于调用约定,但我的理解是参数要么被压入堆栈(因此是否定参考)),要么存储在注册表中。 –
如果你在你的函数开始处执行其他任何操作之前运行'push ebp' /'mov ebp,esp',那么'[ebp + 4]'将保存'call'指令所推送的返回地址。 '[ebp + 8]'是第一个(非寄存器)* arg * /参数。 (不是本地变量) –