I come here today because I am currently on a university work on introduction with assembly x86. As we did C prior this, our teacher asked us to explain this portion of code.

my basic understanding of what it does is:
- EAX will contain the value of the memory area associated with y.
- ECX will contain the value of the memory zone associated with EAX, ie the pointer to y.
- imul will multiply the value of the pointer eax (i.e. the pointer to y) and the value of x.
- We move the pointer of y in EDX, then we move the value of the multiplication to the pointer of y.
Am I right? If not, could someone give me a better explaination of the part I misunderstood?
Thank you in advance.
CodePudding user response:
As with any assembler, you pretty much need to sit with the ISA manual at hand, because each instruction comes with a lot of flavours depending on what you pass to it.
First check out What does `dword ptr` mean? So basically this 32 bit accesses the contents at a certain address.
Since y is a pointer, the contents of y is the address where *y can be found. So first the y address will get moved into eax and then the contents of the address just uploaded into eax will be moved into ecx.
imul with two operands goes like this:
- Two-operand form. With this form the destination operand (the first operand) is multiplied by the source operand (second operand). The destination operand is a general-purpose register and the source operand is an immediate value, a general-purpose register, or a memory location. The product is then stored in the destination operand location.
So it multiplies ecx with whatever was stored at dword ptr[x], that is the contents of x. And stores the result in ecx.
Then again the address y is uploaded to a register edx (maybe an optimization flaw, because eax already holds it). And then the result of the multiplication stored in exc is moved to that location.
CodePudding user response:
Code with comments:
mov eax,dword ptr [y] ;eax = y
mov ecx,dword ptr [eax] ;ecx = *y
imul ecx,dword ptr [x] ;ecx = (*y) * x
mov edx,dword ptr [y] ;edx = y
mov dword ptr[edx], ecx ;(*y) = (*y) * x
