使用 lea 进行加法

car*_*ass 2 c x86 assembly

以下C代码:

int sum(int x, int y) {
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

编译为:

add:
        leal    (%rdi,%rsi), %eax
        ret
Run Code Online (Sandbox Code Playgroud)

我只见过lea用于将内存地址从一个地方移动到另一个地方,但这里似乎正在将值总和移动到eax. 这是如何运作的?

Mar*_*nau 7

事实上,它lea是“加载有效地址”的缩写,因此它最初是用来进行地址计算的。

但是:如果计算结果rsi+rdi是地址或某个整数,这有什么区别吗?

对于 CPU 来说,它没有任何区别!

出于这个原因,如果您不需要设置标志,您可以使用此指令代替add

该操作rax=rsi+rdi可以使用一条 lea指令或使用两条指令的组合来完成:movadd

仅使用一条指令通常比使用两条指令更快、更短。

并且您甚至可以使用指令 ( leal (%rsi,%rdi),%rax) 来执行 8 位、16 位或 32 位加法,因为通过执行该操作,rax=rsi+rdi您隐式地执行了操作eax=esi+edi,ax=si+dial=sil+dil

如果我正确理解了您的代码,eax=esi+edi那么 C 代码完成了 32 位加法 ( )。