A student writes:

     Dr Patt,
     I was reviewing material for the test today, and came across the
     explanation for what the LDR instruction does. I don't understand
     why it would be advantageous to use LDR, wouldn't it simply be
     simpler to say "Computer, load from this address in memory, to

That is exactly what we want to do! We want to say: "Computer, load the contents of this address in memory into this register."

The issue is: how do we tell the computer WHICH address we are talking about? There are three ways, and there are three instructions available to us, depending on which way makes sense at the particular instance: LD, LDR, and LDI.

     this register"  instead of saying "Computer, read this register,
     add X to it, then take that new value, read it from memory, and
     put it into this register"? is there another type of LD instruction
     (LD or LDI?) that will do exactly what I  stated, if not, why not?

I think the best way to answer this is to briefly tell you why I might suggest each of the three ways. I thought I did that in the book. I guess I need to do it more clearly ...another reason for a 3rd edition, I guess.

The first thing to note is that I do not have enough bits in the instruction to specify the exact location in memory, since instructions consist of 16 bits, and I need 4 for the opcode and 3 for the register I will load into. I certainly could make the load instruction 4 + 3 + 16 bits long, but having each instruction have a different number of bits would make the hardware design very, very ugly. MUCH nicer to have all instructions the same length. In our case, 16 bits. For example, it allows us to update PC with "PC is replaced with PC+1" during the FETCH phase of the instruction cycle.

Now, then, which of the three (LD, LDR, LDI) should I choose in a given instance.

If I know that the location of memory containing the data I want to load into the register is close to the location in memory containing the instruction that is telling the computer to do the loading: Use LD. 4 bits for opcode, 3 bits for register, 9 bits left over to specify how far away from the load instruction the location of the data is. The computer sign-extends those 9 bits to 16 bits and adds that to the PC to know where to get the data from. This only works, however, if the location is close enough.

If the location is further away, I have two choices. I need to put the actual address somewhere that I can tell the computer to look to find the address of the data. The LDI uses a location close to the location containing the load instruction. The computer uses the 9 bits in the same way as with LD, but this time when it looks in the computed location, it finds the 16 bit address of the data, rather than the data itself. This allows us to use a location close to the instruction to contain the full 16 bit address. Such a location is called a pointer, because it "points" to the data.

The LDR effectively uses one of the registers as a pointer. That is, the LDR tells the computer to look in the pointer register (i.e., BaseR) and add the sign-extended offset (which gives additional useful capability, which you will see several weeks from now) and that gives the location of the data we want to load. For now, we make that offset 0. The BIG advantage of that is that it allows us to load from a different memory location each time the computer comes across this LDR instruction by simply changing the value in BaseR. THAT is very, very useful. In fact, it is particulary useful in the example we started in class on Wednesday and will finish on Monday.


Incidentally, we refer to the three choices as "addressing modes" and every computer's ISA has several addressing modes, for exactly the reasons discussed above: at different times it is appropriate to instruct the computer where to look for the data in different ways. Each choice is an addressing mode.

Good luck.

Yale Patt

     << name withheld ... >>