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
(虽然是暂时的)并且它要求您实际设置一个堆栈(可能,但不是 绝对 这种情况)所以你最好坚持使用单线 :-)
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
(虽然是暂时的)并且它要求您实际设置一个堆栈(可能,但不是 绝对 这种情况)所以你最好坚持使用单线 :-)