An array is a contiguous block of memory, nothing more and nothing less. Each array item is at its own address.
What is a Structure?
A Structure is an array on steroids, it is also a contiguous block of memory. Unions are a different beast, memory can overlap.
If you define the variable - szHello BYTE "Hello", 0 it will create an array of 6 bytes (including the null terminator)
Lets say szHello starts at address - 4206719 where will it end? It will end at address - 4206724
If dwHello starts at 4206719, how big is it in memory? Where would it end?
dwHello DWORD 72, 101, 108, 108, 111, 0
Once you understand that arrays are a contiguous block of memory, then it is easy to add to and read from an array.
Ok, how do you access each element?
This is one way...
.code mov esi, offset szHello xor ecx, ecx @@: xor eax, eax mov eax, [esi + 1 * ecx] ; ASCII code is in al, do something with it here PrintDec al inc ecx cmp ecx, 6 jne @B
Since we don't need the high bytes of eax, we will zero it out at line 4
line 5 - esi is the pointer to the array, 1 is the element size and ecx is the element index
line 6 - increase our element counter
line 7 - the length of our array, did we reach it?
Simple right? Same thing to access a dword array, except we change the element size to 4:
mov esi, offset dwHello xor ecx, ecx @@: xor eax, eax mov eax, [esi + 4 * ecx] ; ASCII code is in al, do something with it here PrintDec al inc ecx cmp ecx, 6 jne @B
If you were using an array of WORDS, the element size would be 2
How would I store numbers in an array then sum up the array?
This comes up a lot, so I will show you:
.data? dwArray dword 4 dup (?) ; store 4 numbers .code mov esi, offset dwArray xor ecx, ecx mov edx, 1 ; store 1 - 5 in array @@: mov [esi + 4 * ecx], edx inc edx inc ecx cmp ecx, 5 jne @B ; Loop through array and sum it up xor ecx, ecx xor eax, eax @@: add eax, [esi + 4 * ecx] inc ecx cmp ecx, 5 jne @B ; eax now contains the sum of the array