1

我了解 EBP 和 ESP 寄存器的基本语义,但我对以下内容感到有些困惑:

mov ebp, eax

下一行是:

mov edi, dword ptr [ebp]

我认为 ebp 寄存器是我们遍历堆栈的参考点,添加到它给我们参数,减去得到局部变量。那么通过将 eax 移动到 ebp,这不会引起问题吗?

我可以理解的说:

mov [ebp+12], eax

我猜这是沿着将 eax 移动到 out 参数的路线?

4

1 回答 1

5

如果不查看更多代码,就不可能通过这些指令判断正在访问哪些实体。

ebp除了访问子程序参数和局部变量之外,x86 CPU 中没有任何东西可以阻止您使用其他东西。

在 32 位模式下,您也可以esp通过[esp+something]. 在 16 位模式下,您不能这样做,sp并且需要使用以下列表中的寄存器之一:bp, bx, si, di

一些编译器可以选择使用[esp+something]而不是[ebp+something]访问堆栈上的数据。这为您购买了一个额外的通用寄存器,您可以将其用于其他用途。

只要您的代码不需要保留 的值,ebp或者只要它恢复ebp到预期值,执行 . 就不会发生任何不好的事情mov ebp, eax

于 2012-10-19T10:11:34.717 回答