【问题标题】:How does the lea instruction interact with esp?lea 指令如何与 esp 交互?
【发布时间】:2014-03-04 02:39:25
【问题描述】:

我读到例如“lea eax, [ebp - 120]”的意思是

mov    eax, ebp
sub     eax, 120

假设 esp 在 ebp-200,然后在函数后面

lea eax, [ebp - 120]
push eax
call xyz

这是否意味着 ebp-120 的值被加载到 eax 寄存器中,然后这个 4 字节的值被压入堆栈?或者这是否意味着 esp 进一步递减 120,从而创建了一个从 ebp-200 到 ebp-320 的缓冲区,而 esp 现在位于 ebp-320?

【问题讨论】:

  • 你的第一个解释是正确的。
  • push eax 将eax 寄存器的内容压入堆栈。
  • 代码正在传递一个指向局部变量的指针。存储在 ebp-120 处调用者的堆栈帧中。很常见。与 esp 没有任何关系,除了在调用者的函数入口处,需要调整 esp 值以为局部变量腾出空间。许多教程和书籍都很好地描述了堆栈帧的工作方式。
  • 你们能看看这个吗? stackoverflow.com/questions/30007738/…

标签: assembly x86


【解决方案1】:

What's the purpose of the LEA instruction?

lea 看起来比 mov 更花哨,但实际上它只做了 mov 的部分功能:mov 计算地址并取消引用内存,lea 只计算地址。

在您的示例中,eax 接收存储在 in ebp 中的值减去 120,而不是存储在 地址 中的值存储在 ebp 中减去 120。该值继续被压入堆栈。如果此程序集对应于 C 代码,则 eax/stack 将包含指向某个变量的指针。

lea 和 esp 之间没有直接的交互。除非 esp 是 lea 的参数之一,否则 lea 不会读取或修改 esp。

【讨论】:

  • 我喜欢这样解释:lea 是一个移位加指令,恰好使用了内存地址语法和机器码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2019-01-27
  • 2012-02-27
  • 2014-04-23
  • 2012-02-27
  • 2011-09-13
  • 2011-05-30
相关资源
最近更新 更多