ebp
寄存器(基址指针)通常用于处理堆栈帧(堆栈的不同“级别”)。虽然堆栈指针可以根据您推送和弹出的内容进行更改,但基本指针在相同堆栈级别时保持不变。
这样的话,你可以在所有的局部变量得到的ebp
一侧(例如,mov ax,[ebp-8]
)和所有在另一边传递的参数(例如,mov ax,[ebp+12]
),以及是相对于ebp
任何其他地点,如某些情况下的返回码。
您之所以拥有之前的推送到堆栈上的基本指针的内容是这样,当您移动到前一个堆栈帧时,很容易恢复该值。您只需将该值输入ebp
并将其恢复,即可以访问当地人并为下一级传递参数。
This article提供了它如何能工作的图形概览,这是我经常发现无价:
+------------------+
+-> | prev-prev EBP |
| +------------------+
| | function param 2 |
| +------------------+
| | function param 1 |
| +------------------+
| | return address |
| +------------------+
+---| previous EBP | <-- current EBP
+------------------+
| local var 1 |
+------------------+
它的工作方式是,你推参数的功能,那么你只需要调用该函数。在函数开始时的序言代码是一样的东西:
push ebp ; save old base pointer.
mov ebp, esp ; set new copy.
sub esp, 16h ; allocate space for local variables.
其保存旧ebp
并建立一个新的,指向由调用代码推变量。从堆栈指针中减去是为本地分配空间。
如上所述,这意味着通过参数可以得到与[ebp+N]
和当地人与[ebp-N]
。
的收尾代码是相反的操作:
add esp, 16h ; forget about locals.
pop ebp ; restore previous value
ret ; return to calling code.
之后ebp
现在被设置为它的先前值。