我理解EBP和ESP寄存器的基本语义,但我对以下内容感到有些困惑:
mov ebp, eax
下一行是:
mov edi, dword ptr [ebp]
我认为ebp寄存器是我们参考堆栈的参考点,添加它给我们参数,减去获取局部变量。因此,通过将eax移动到ebp,这不会导致问题吗?
我能理解说:
mov [ebp+12], eax
我猜这是将eax移动到out参数的行?
答案 0 :(得分:5)
如果没有看到更多代码,就不可能通过这些指令告诉使用哪些实体。
除了访问子例程参数和局部变量之外,x86 CPU中的任何内容都不会阻止您使用ebp
。
在32位模式下,您也可以通过esp
访问堆栈上的变量,因为[esp+something]
有内存操作数编码。在16位模式下,您无法使用sp
执行此操作,并且需要使用以下列表中的一个寄存器:bp
,bx
,si
,{ {1}}。
某些编译器可以选择使用di
而不是[esp+something]
来访问堆栈数据。这会为您购买额外的通用寄存器,您可以将其用于其他事项。
只要您的代码不需要保留[ebp+something]
的值,或者只要将ebp
恢复到预期值,那么执行ebp
就不会发生任何问题。