如何解决使用lea进行加法
以下C代码:
/* returns string array of tokens (words in the sentence) after splitting by space */
String[] tokens = sentence.split(" ");
if(tokens.length() > 3) {
// true
} else {
// fasle
}
编译为:
int sum(int x,int y) {
return x + y;
}
我只看到add:
leal (%rdi,%rsi),%eax
ret
用于将内存地址从一个位置移动到另一个位置,但是这里似乎是将一个值和移动到lea
中。怎么运作的?
解决方法
实际上,lea
是“ 有效负载地址 ”的缩写,因此最初旨在执行地址计算。
但是:如果计算rsi+rdi
的结果是地址或某个整数,有什么区别吗?
对于CPU来说,没有任何区别!
因此,如果您不需要设置标志,则可以使用此说明代替add
。
操作rax=rsi+rdi
可以使用一条 lea
指令或结合使用两条指令:mov
和{ {1}}。
仅使用一条指令通常比使用两条指令更快,更短。
您甚至可以使用指令(add
来执行8位,16位或32位加法,因为通过执行操作leal (%rsi,%rdi),%rax
可以隐式执行操作rax=rsi+rdi
,eax=esi+edi
和ax=si+di
。
如果我正确理解您的代码,则C代码会完成32位加法(al=sil+dil
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。