You'll have to excuse me, I'm brand new to x86 assembly, and assembly in general.
So my question is, I have something like:
addl %edx,(%eax)
%eax is a register which holds a pointer to some integer. Let's call it xp
Does this mean that it's saying: *xp = *xp + %edx
? (%edx
is an integer)
I'm just confused where addl will store the result. If %eax
is a pointer to an int, then (%eax)
should be the actual value of that int. So would addl
store the result of %edx+(%eax)
in *xp
? I would really love for someone to explain this to me!
I really appreciate any help!
Yes, this instruction is doing exactly what you think it's doing.
Most x86 arithmetic instructions take two operands: a source and a destination. In AT&T syntax (used here), the destination is always the right operand. So with an instruction like:
addl %edx, %eax
the values in edx
and eax
are added together and the result is stored in eax
. However, in your example, (%eax)
is a memory operand; that's what parentheses mean in AT&T syntax (like square-brackets in NASM syntax).
This means that eax
is treated as a pointer, so the right operand is taken from the address pointed to by eax
, and the result is stored to the same address.