如何进行地址计算?

时间:2017-10-09 03:38:24

标签: assembly memory x86 hex att

我在网站上看到了这个案例:

cmpl $0x0,-0x20(%ebp)

jne xxx (program terminated   so -0x20(%ebp) == 0)

cmpl $0x1,-0x1c(%ebp)

jne xxx (program terminated   so -0x1c(%ebp) == $1)

然后:

lea -0x18(%ebp),%ebx

mov -0x4(%ebx),%eax

该网站称%eax = -0x4(%ebx)= -1c(%ebp)== $ 0

所以我不知道为什么-0x4(-0x18(%ebp))将等于-1c(%ebp) 请帮忙,谢谢!

1 个答案:

答案 0 :(得分:2)

  

所以我不知道为什么-0x4(-0x18(%ebp))等于-1c(%ebp)请帮助,谢谢!

字面上取-0x4(-0x18(%ebp))在x86汇编语法中没有任何意义,因此它也不能等于-1c(%ebp)

所以这取决于你在" -0x4(-0x18(%ebp))" 下的理解。

有两种逻辑方法可以评估(猜测你的意思)。

1)取消引用ebp-0x18,并将内存中的值(来自您的问题未知)用作内存地址,将其调整为-4并再次取消引用该地址=这与其余的问题文本无关和代码提供,所以如果你这样理解,你就会走错方向。

2)计算值ebp-0x18,然后添加另一个-0x4,然后将该值取消引用作为内存地址(来自内存的加载值)=这是更明智的一个,与另一个相关你发布的东西。即只发生一次解除引用。它没有使该表达式成为有效的ASM语法,只有在这样评估时才有意义。

然后最终地址等于ebp - 0x18 - 0x04,可以简化为ebp - 0x1C。正如Peter Corder评论的那样,它就像24 + 4 = 28(0x18 + 0x04 = 0x1C)一样简单。

如果您按照1)中的说明理解它,那么您可能误解了lea指令?关于它已经有一些问题了:
What's the purpose of the LEA instruction?(有几个好的答案,每个都添加一些细节)
What is the difference between MOV and LEA?

总之,lea确实使用与mov相同的内存操作数语法,但在它之后将计算内存地址(与mov指令相同),它停在那里并将地址值本身放入目标寄存器中作为结果。它没有接触存储芯片的价值(没有解除引用)。 mov指令继续运行,从内存中获取最终值,并将其存储到目标寄存器中。

最后,正如prl评论的那样,从代码的第一部分开始,地址ebp-0x1c的内存值为1,而不是0.必须是您身边的拼写错误,或者是网络作者。也许在第一个版本中,他确实使用-0x1c作为lea,然后mov将从ebp-0x20获取0。然后通过引入第三个偏移-0x18并且忘记将mov偏移量调整为-8或结果为1来使其变得不那么明显?只是猜测。