之间的功能区别是什么
addq (%rbx), %rax
和
movl (%rbx), %ecx
addq %rcx, %rax
汇编?
我认为他们做同样的事情,但功能上的区别是什么?
答案 0 :(得分:3)
第一个从位置rbx
的内存中拉出完整四字(64位),并将其添加到rax
寄存器。
第二个从同一位置拉出长字(仅32位)并将其存储到ecx
(将rcx
的上半部分归零)。然后,它会将rcx
添加到rax
。
所以我想说的主要区别在于第二个片段没有将内存中的完整四字添加到rax
,只有长字。
第一个(单线程)代码示例更类似于:
movq (%rbx), %rcx
addq %rcx, %rax
虽然 为了使其更接近匹配,您可以在此过程中保存并恢复rcx
:
rcx
虽然当然,你已经改变push %rcx
movq (%rbx), %rcx
addq %rcx, %rax
pop %rcx
(虽然是暂时的)并且它要求你实际设置一个堆栈(可能,但不是绝对的情况)所以你可能会更好地坚持使用单线: - )