1

如果我说:

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

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

edx = eax + eax * 2

这个格式是如何工作的?

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

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

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

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

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

esi + ebx * 4

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

4

1 回答 1

4

用 计算值lea让人想起该操作更快(因为它是由进行地址计算的电路计算的)或代码大小更小。请注意,只需一个操作,您就可以一步完成加法和乘法运算。当前的处理器可能会更快地执行此操作,而不是add后跟 a mul,但考虑到推测执行、算术单元复制等,尚不清楚。

至于以下说明,只要您看到括号就意味着您正在取消引用该地址,因此:

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

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

于 2012-04-22T00:14:03.777 回答