addq和movl的区别,然后addq

Difference between addq and movl, then addq

在功能上有什么区别

addq (%rbx), %rax

movl (%rbx), %ecx addq %rcx, %rax

在汇编中?

我认为他们做同样的事情,但功能上有什么区别?

第一个从内存中的 rbx 位置提取 full 四字(64 位)并将其添加到 rax 寄存器。

第二个从同一位置拉出一个 longword(仅 32 位)并将其存储到 ecx(将 rcx 的上半部分归零) .然后它将 rcx 添加到 rax.

所以我想说的主要区别是第二个片段没有将内存中的完整四字添加到 rax,只有长字。

第一个(单行)代码示例更类似于:

movq    (%rbx), %rcx
addq    %rcx,   %rax

尽管 that 并不完全相同,因为它改变了 rcx。为了使其更接近匹配,您可以在过程中保存和恢复 rcx

push    %rcx
movq    (%rbx), %rcx
addq    %rcx,   %rax
pop     %rcx

尽管如此,当然,您已经更改了 rsp(虽然是暂时的)并且它要求您实际设置一个堆栈(可能,但不是 绝对 这种情况)所以你最好坚持使用单线 :-)