We have a list of strings in data memory
animals: .asciiz "cow"
.asciiz "horse"
.asciiz "cat"
.byte 0
The objective is to have a pointer that points to the beginning of the first string, then the second string, the third, and so on until we reach the end.
Let's start by visualizing what the data segment will look like after this is loaded into memory. Remember that each character takes one byte, and there is a null byte at the end of each string. So it looks like this:
| c | o | w | \0 | h | o | r | s | e | \0 | d | o | g | \0 | \0 | |
| ^ | ^ | ^ | ^ |
Note that we use "\0" to indicate a null byte. Using "0" would indicate the character you get by typing the zero key on the keyboard. If you look in the table in the book you'll see that this character is represented by the number 48, not the number 0. The backslash lets us distinguish a null character (represented by 0) from the zero character (represented by 48). What we want is to have a register that points at the places indicated by the carets in the second row. It will point to the first indicated position if you want to use the string "cow"; it will point to the second if you want to use the string "horse"; it will point to the third position if you want to use the string "dog". If you find it pointing to the fourth position, you know that it is time to quit. (It is obvious that there is a loop going on here, right?)
Now I hope that it is obvious that the pointer register will at some time or other point to all the positions in the first row of the table, not just the ones that have carets under them. In other words, you will get from the 'c' to the 'h' by going through all the intermediate positions. (It is obvious that there is another loop going on here, right?) The difference between the marked positions and the others is that the inner loop knows not to stop at the unmarked positions and to stop at the marked ones. That way the outer loop sees the pointer only in the marked positions. These are the ones it will use as parameters to send to the verse method so that it will print the correct strings. (And they are also how it will know when to stop.)