汇编代码中的地址和“lea”

时间:2012-04-22 00:08:19

标签: assembly x86 addressing-mode

如果我说:

lea (%eax,%eax,2), %edx

我被教导它本质上意味着:

edx = eax + eax * 2

这种格式如何运作?

我猜这导致了第二个问题。如果我有这样的事情:

add -0x4(%esi, %ebx, 4), %eax

我知道第一个操作数被添加到第二个操作数然后存储在第二个操作数中,但是我不明白的是第一个操作数的符号。另一个例子是如果我有:

cmp %eax, (%esi, %ebx, 4)

...,这是否意味着将%eax的值与以下值进行比较:

esi + ebx * 4

...?我试着搜索了很多这些东西,但我想我没有使用正确的单词来找到有意义的答案,所以我决定在这里发帖。

1 个答案:

答案 0 :(得分:4)

使用lea计算值让人想起这个操作要么更快(因为它是由执行地址计算的电路计算的),要么是代码大小更小。请注意,只需一个操作,您就可以在一个步骤中执行添加和乘法操作。当前的处理器可能会更快地执行它而不是add后跟mul,但是由于推测执行,算术单元复制等原因并不清楚。

至于以下说明,每当您看到括号表示您要取消引用该地址时,请:

add -0x4(%esi, %ebx, 4), %eax

表示将%eax放在-4 + esi + ebx*4给出的地址中,因此它意味着访问内存中的该位置并将存储的内容分配给%eax