如何进行地址计算?

如何进行地址计算?

问题描述:

我看到这种情况下,从一个网站:如何进行地址计算?

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

0x18 + 0x4 = 0x1c。 (十进制,24 + 4 = 28)。这就是你要问的吗? –

+1

这听起来像网站试图传达,你可以从寄存器ebx和ebp中存储的两个不同的基地址读取相同的内存位置,但谁知道你没有提供足够的信息。 – Rafael

+1

它真的说-1c(%ebp)是0,还是一个错字?因为在代码第4行的注释中,它表示它是1. – prl

所以我不知道为什么-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指令?目前已经有一些关于它的SO问题:
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来使其不那么明显?只是猜测。