以下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. 这是如何运作的?
事实上,它lea是“加载有效地址”的缩写,因此它最初是用来进行地址计算的。
但是:如果计算结果rsi+rdi是地址或某个整数,这有什么区别吗?
对于 CPU 来说,它没有任何区别!
出于这个原因,如果您不需要设置标志,您可以使用此指令代替add。
该操作rax=rsi+rdi可以使用一条 lea指令或使用两条指令的组合来完成:mov和add。
仅使用一条指令通常比使用两条指令更快、更短。
并且您甚至可以使用指令 ( leal (%rsi,%rdi),%rax) 来执行 8 位、16 位或 32 位加法,因为通过执行该操作,rax=rsi+rdi您隐式地执行了操作eax=esi+edi,ax=si+di和al=sil+dil。
如果我正确理解了您的代码,eax=esi+edi那么 C 代码完成了 32 位加法 ( )。