Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly lea指令如何与esp互动?_Assembly_X86 - Fatal编程技术网

Assembly lea指令如何与esp互动?

Assembly lea指令如何与esp互动?,assembly,x86,Assembly,X86,例如,我读到“leaeax,[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? lea看起来比mov更奇特

例如,我读到“leaeax,[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?

lea看起来比mov更奇特,但实际上它只做mov的一部分工作:mov计算地址并解引用内存,lea只计算地址

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


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

您的第一个解释是正确的。
push eax
eax
寄存器的内容推送到堆栈上。代码正在传递指向局部变量的指针。存储在ebp-120处调用方的堆栈帧中。非常普遍。与esp无关,除了在调用方的函数项中,需要调整esp值以为局部变量留出空间。堆栈框架的工作方式在很多教程和书籍中都有很好的描述。你们能看看这个吗?我想解释一下,
lea
是一个移位和加法指令,恰好使用内存地址语法和机器代码。