Look at direct, indirect and indexed addressing as a street address.
I'll choose Elm street for our example (My grandma lived on Elm street) The houses on Elm street are numbered sequentially, not skipping numbers.
Now lets liken Elm street to a file. Elm street has multiple houses on it, and a file has multple registers in it. Lets simultaneiously look at the house with the address 5 Elm Street, and the register N7:5 (word 5 of file 7). Keep in mind that the file actually starts at address 0.
Direct Addressing:
5 Elm street is one specific house, it cannot be any other.
N7:5 is one specific register, it cannot be any other.
Indexed Addressing, this in the kind of addressing that uses a # before the address.
We do indexed addressing all when giving directions, ie, "My house is the second house after the big ugly green house."
If my index number is 2, then
5 Elm street is the second house after 3 Elm street.
and if the S;24 register in my PLC contains the number 2, then
#N7:3 indexes to the register N7:5, or two registers after N7:3.
Note: I usually try and stay away from indexed addressing, but its important to understand as there are several instructions that use it internally.
Indirect Addressing. This is what the program you posted uses.
We also do indirect addressing all the time when giving directions, ie, "My house is the fifth house on the street."
In indirect addressing we require a pointer. This pointer can be any integer address. Lets use N9:0.
So to point at the house 5 Elm Street, my pointer need to be a 5, or the fifth house on elm street.
And to point at N7:5, I need I need a 5 in N9:0. So I MOV a 5 into N9:0, and N7:[N9:0] points at N7:5, or element number 5 of the file.
Indirect addresses can point to files, words, or bits.
N7:[N9:0] <--indirect address a word.
N7:5/[N9:0] <--indirect address a bit
N7:[N9:0]/[N9:1] <--indirect address a word and a bit.
N[N9:0]:5 <-- indirect address a file, be very careful when using this form
When using indirect addressing you need to make sure you don't address across file boundaries. If N9:0 = 100 but file N7:0 only has 50 elements in it then N7:[N9:0] will get you in trouble. There are ways to allow it, but I don't recommend them and for now lets just leave that for you to learn on your own after you have mastered indirect addressing.
I hope that helps and that it doesn't obfuscate (muddy things up) the differences between addressing methods.