我在网站上看到了这个案例:
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) 请帮忙,谢谢!
答案 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来使其变得不那么明显?只是猜测。