Indexing in assembly is basically the same as C/C++ except for one difference: you have to know the size of your data elements.
For example, to loop through an array of bytes (or characters in a string) in assembly, you could do the following:
mov eax, 0
mov ecx, 0
loop_start:
cmp ecx, ARRAY_LENGTH
jge loop_end
add eax, BYTE PTR myArray[ecx]
add ecx, 1
jmp loop_start
loop_end:
As you can see, the array is looped through one element at a time by incrementing ecx (which I'm using as a counter). Each element is added to eax which contains the sum at the end of the loop. Notice I had to add "BYTE PTR" when referencing the array to tell the assembler what type of data I'm using.
Now take a look at this code which does the same thing for DWORD data (4 bytes):
mov eax, 0
mov ecx, 0
loop_start:
cmp ecx, ARRAY_LENGTH
jge loop_end
add eax, myArray[ecx*4]
add ecx, 1
jmp loop_start
loop_end:
Only two things changed: I no longer needed to use "BYTE PTR" here because, unless told otherwise, the assembler assumes you are using 32-bit data types on a 32-bit machine; I also needed to change the index of the array to "ecx*4" because each element in the array is 4 bytes long. Most data types used on 32-bit machines are 32 bits in size so the later example will be more common.
To answer your specific question, here is one way to loop through an array of strings and display them:
.data
sunday db "Sun",0
monday db "Mon",0
tuesday db "Tues",0
wednesday db "Wed",0
thursday db "Thurs",0
friday db "Fri",0
saturday db "Sat",0
daysOfWeek dd OFFSET sunday, OFFSET monday, OFFSET tuesday OFFSET wednesday
dd OFFSET thursday, OFFSET friday, OFFSET saturday
.code
mov ecx, 0
loop_start:
cmp ecx, 7
jge loop_end
mov eax, daysOfWeek[ecx*4]
; eax now contains the pointer to the
; next element in the array of days
add ecx, 1
jmp loop_start
loop_end:
Because pointers on a 32-bit machine are 32 bits wide, treat them like DWORDs as in the second example.