Relative Addressing

As we have seen, all symbolic addresses are based on variants of the concept of
base address (stored in a base register) and an offset.

Note that the offset, encoded as a 12–bit unsigned integer, is always non–negative.

The possible offset values range from 0 through 4095 inclusive.

We now introduce a way to reference a storage position relative to the symbolic
address of another label.  This allows direct reference to unlabeled storage.

The form of a relative address is LABEL+N, where N is the byte offset of
the desired storage relative to the symbolic address associated with
LABEL.

Again, note the lack of spaces in the relative address.  This is important.

Consider the two data declarations.

   F1    DC F‘0’   A four–byte full-word.

   F2    DC F‘2’   Another full-word at address F1 + 4

Consider the following two instructions.  They are identical.

   L  R6, F2

   L  R6, F1+4


Relative Addressing: A More Common Use

The most common use of relative addressing is to access an unlabeled section
of a multi–byte storage area associated with a symbolic address.

Consider the following very common declaration for card data.  It sets aside a storage
of 80 bytes to receive the 80 characters associated with standard card input.

CARDIN  DS CL80

While only the first byte (at offset 0 from CARDIN) is directly named, we may use
relative addressing to access any byte directly.  Consider this figure.

The second byte of input it is at address CARDIN+1, the third at CARDIN+2, etc.

Remember that the byte at address CARDIN+N is the character in column (N + 1)
of the card.  Punched cards do not have a column 0.