两者之间的功能区别是什么
addq (%rbx), %rax
和
movl (%rbx), %ecx
addq %rcx, %rax
在组装?
我认为他们做同样的事情,但功能上的区别是什么?
第一个从内存中的位置拉出一个完整的四字(64 位)rbx并将其添加到rax寄存器中。
第二个从同一位置拉出一个长字(只有 32 位)并将其存储到ecx(将 的上半部分归零rcx)。然后它添加rcx到rax.
所以我想说的主要区别在于,第二个片段没有将内存中的完整四字添加到rax,只添加长字。
第一个(单行)代码示例更类似于:
movq (%rbx), %rcx
addq %rcx, %rax
Run Code Online (Sandbox Code Playgroud)
尽管即使这也不是严格相同的,因为它发生了变化rcx。为了使其更加匹配,您可以rcx在此过程中进行保存和恢复:
push %rcx
movq (%rbx), %rcx
addq %rcx, %rax
pop %rcx
Run Code Online (Sandbox Code Playgroud)
当然,虽然那时你已经改变了rsp(尽管是暂时的)并且它需要你实际设置一个堆栈(可能,但并非绝对如此)所以你最好坚持使用单线:-)