我理解EBP和ESP寄存器的基本语义,但我对以下内容略有不满:
mov ebp, eax
Run Code Online (Sandbox Code Playgroud)
下一行是:
mov edi, dword ptr [ebp]
Run Code Online (Sandbox Code Playgroud)
我认为ebp寄存器是我们参考堆栈的参考点,添加它给我们参数,减去获取局部变量.因此,通过将eax移动到ebp,这不会导致问题吗?
我能理解说:
mov [ebp+12], eax
Run Code Online (Sandbox Code Playgroud)
我猜这是将eax移动到out参数的路线?
在没有看到更多代码的情况下,无法通过这些指令判断正在访问哪些实体.
x86 CPU中的任何内容都不能阻止您使用ebp除访问子例程参数和局部变量之外的其他内容.
在32位模式下,您也可以访问堆栈上的变量esp,因为存在操作数编码[esp+something].在16位模式下,你不能这样做,与sp和必须使用的寄存器中的一个从以下列表:bp,bx,si,di.
有些编译器可以选择使用[esp+something]而不是[ebp+something]访问堆栈数据.这会为您购买额外的通用寄存器,您可以将其用于其他事项.
只要您的代码不需要保留其值ebp或者只要它恢复ebp到预期值,就不会发生任何不好的事情mov ebp, eax.
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |