我了解 EBP 和 ESP 寄存器的基本语义,但我对以下内容感到有些困惑:
mov ebp, eax
下一行是:
mov edi, dword ptr [ebp]
我认为 ebp 寄存器是我们遍历堆栈的参考点,添加到它给我们参数,减去得到局部变量。那么通过将 eax 移动到 ebp,这不会引起问题吗?
我可以理解的说:
mov [ebp+12], eax
我猜这是沿着将 eax 移动到 out 参数的路线?
如果不查看更多代码,就不可能通过这些指令判断正在访问哪些实体。
ebp
除了访问子程序参数和局部变量之外,x86 CPU 中没有任何东西可以阻止您使用其他东西。
在 32 位模式下,您也可以esp
通过[esp+something]
. 在 16 位模式下,您不能这样做,sp
并且需要使用以下列表中的寄存器之一:bp
, bx
, si
, di
。
一些编译器可以选择使用[esp+something]
而不是[ebp+something]
访问堆栈上的数据。这为您购买了一个额外的通用寄存器,您可以将其用于其他用途。
只要您的代码不需要保留 的值,ebp
或者只要它恢复ebp
到预期值,执行 . 就不会发生任何不好的事情mov ebp, eax
。