我了解 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。