addq 和 movl 的区别,然后是 addq

And*_*rew 2 assembly x86-64

两者之间的功能区别是什么

addq (%rbx), %rax

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

在组装?

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

pax*_*blo 5

第一个从内存中的位置拉出一个完整的四字(64 位)rbx并将其添加到rax寄存器中。

第二个从同一位置拉出一个长字(只有 32 位)并将其存储到ecx(将 的上半部分归零rcx)。然后它添加rcxrax.

所以我想说的主要区别在于,第二个片段没有将内存中的完整四字添加到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(尽管是暂时的)并且它需要你实际设置一个堆栈(可能,但并非绝对如此)所以你最好坚持使用单线:-)