我读过例如“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字节的vaule压入堆栈?或者它是否意味着esp进一步递减120,从而创建一个从ebp-200到ebp-320的缓冲区,esp现在在ebp-320?
答案 0 :(得分:2)
What's the purpose of the LEA instruction?
lea看起来比mov更加花哨,但实际上它只做了mov所做的一部分:mov计算地址并取消引用内存,lea只计算地址。
在您的示例中,eax接收 ebp中存储的值,减去120,而不是存储在地址中的值,该值存储在ebp中,减去120。该值继续被推入堆栈。如果此程序集对应于C代码,则eax / stack将包含指向某个变量的指针。
lea和esp之间没有直接的互动。除非esp是lea的参数之一,否则lea不会读取或修改esp。