• Status: Solved
• Priority: Medium
• Security: Public
• Views: 689

# mov array[eax * 4], 0 /* when does multiply happen? */

I know this is not a C question, but maybe some assembly
guys look at this section.

In the assembly statement:

mov dword ptr array[eax * 4], 0

When does the eax register get multiplied by four?

Is the resulting index stored anywhere before it
is added to "array"?  I imagine that the result of
"eax * 4" must be stored somewhere, but where?

NOTE: If you want to see this for yourself, compile
this and look at the assembly that results:

int main()
{
int array[50];
int x = 5;

array[x] = 0;

return 0;
}
0
alfredj
• 2
1 Solution

Commented:
mov dword ptr array[eax * 4], 0 is a standard 486 instruction using some of the more special types of addressing

you can look at some Assembler book for more details
(sorry if i'm wrong with terms - i'm just translating a Russian book)

mov eax, 123456h   - immediate addressing
mov eax, ecx  - registry addressing
mov eax, [123456h] - absolute addressing
mov eax, [ecx] + 123456h - indexed addressing with offset
mov eax, [esi*4] + 1234h - indexed addressing with scaling and offset
..
mov eax, [ebx][edi*2] + 12345h - base index with scaling and offset addressing

so you have ' indexed addressing with scaling and offset'. this is a standard addressing mode in 386+ (or 486+) processors.

hope this helps
heyhey

0

Commented:
you have the following algorithm for calculating the real addres (and maybe it works only in P-mode ?? )

address = offset + [data at base address] + value of index register * multiplier (+base of the segment :).
multiplier can be 1,2,4 or 8 (there are two bits in the instruction opcode reserved for it)

dword ptr array[eax * 4]
doesn't have a base addres - you have just indexed array
calculated address = offset +  value of index register * multiplier
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.