【发布时间】:2016-10-20 05:23:28
【问题描述】:
两者的功能区别是什么
addq (%rbx), %rax
和
movl (%rbx), %ecx
addq %rcx, %rax
在组装中?
我认为他们做同样的事情,但功能上的区别是什么?
【问题讨论】:
-
第二个例子改变了ECX,第一个没有。
两者的功能区别是什么
addq (%rbx), %rax
和
movl (%rbx), %ecx
addq %rcx, %rax
在组装中?
我认为他们做同样的事情,但功能上的区别是什么?
【问题讨论】:
第一个从rbx 位置的内存中取出一个完整 四字(64 位)并将其添加到rax 寄存器中。
第二个从同一位置提取一个 longword(仅 32 位)并将其存储到 ecx(将 rcx 的上半部分归零)。然后它将rcx 添加到rax。
所以我想说主要区别在于第二个 sn-p 不是将内存中的完整四字添加到 rax,而只是添加长字。
第一个(单行)代码示例更类似于:
movq (%rbx), %rcx
addq %rcx, %rax
尽管 that 并不完全相同,因为它改变了rcx。为了使其更加匹配,您可以在此过程中保存和恢复rcx:
push %rcx
movq (%rbx), %rcx
addq %rcx, %rax
pop %rcx
尽管如此,当然,您已经更改了 rsp(尽管是暂时的)并且它需要您实际设置一个堆栈(可能,但不是绝对这种情况),因此您可以最好只坚持单线:-)
【讨论】:
asm 关键字 - 我假设,基于问题和标签,这是纯粹的组装。