2012-10-19 59 views
1

我明白EBP和ESP寄存器的基本语义,但我稍微用以下困惑:移动另一个寄存器EBP注册

mov ebp, eax 

下一行是:

mov edi, dword ptr [ebp] 

我以为ebp寄存器是我们走栈的参考点,增加它给我们参数,减去获取局部变量。所以通过将eax移动到ebp,这不会导致问题吗?

我可以理解说:

mov [ebp+12], eax 

我猜想,是一起移动到EAX out参数的线路?

回答

5

无法看出使用这些指令访问哪些实体而不会看到更多的代码。

x86 CPU中的任何内容都不允许您将ebp用于访问子例程参数和局部变量以外的内容。

在32位模式下,您可以通过esp访问堆栈变量,因为存在[esp+something]的内存操作数编码。在16位模式下,您不能使用sp来完成此操作,并且需要使用以下列表中的一个寄存器:bpbx,si,di

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

只要您的代码不需要保留ebp的值或只要它将ebp恢复到预期值,就可以在做mov ebp, eax时发生任何错误。