如果堆栈向下增长,并且EBP指向堆栈的基础,那么为什么我会看到mov eax [ebp + 4]
这样的操作。这不会引用当前堆栈帧之外的变量吗?
答案 0 :(得分:3)
在调用函数之前,参数会被压入堆栈。
在函数开始时,按下EBP以及需要保存的任何其他寄存器,然后将EBP设置为等于ESP。
如果在函数中声明了变量,例如C自动变量,则ESP递减以在EBP和ESP之间留出空间来保存这些变量。
因此EBP+offset
用于参数,EBP-offset
用于局部变量。
在函数返回之前,ESP被设置回EBP,然后堆栈被解开。