What is the functional difference between
addq (%rbx), %rax
and
movl (%rbx), %ecx addq %rcx, %rax
in assembly?
I think they do the same thing, but what is the functional difference?
11 Answer
The first one pulls a full quadword (64 bits) out of memory at location rbx and adds that to the rax register.
The second pulls a longword (only 32 bits) from that same location and stores it into ecx (zeroing the top half of rcx). Then it adds rcx to rax.
So I would say the main difference is that the second snippet is not adding the full quadword in memory to rax, only the longword.
The first (one-liner) code sample would be more akin to:
movq (%rbx), %rcx addq %rcx, %rax although even that is not strictly identical since it changes rcx. To make it an even closer match, you could save and restore rcx as part of the process:
push %rcx movq (%rbx), %rcx addq %rcx, %rax pop %rcx Although then, of course, you've changed rsp (albeit temporarily) and it requires you to have a stack actually set up (likely, but not absolutely the case) so you may be better off just sticking with the one-liner :-)