Example 1
.EXTERNAL COMM_AREA 1
.BASE R1, COMM_AREA 2
CURR_LINE = COMM_AREA + 0
CURR_COLUMN = COMM_AREA + 4
CURR_MODE = COMM_AREA + 8
LDA R4, 17 ; LDA R4, 17(R31) 3
LDL R2, CURR_LINE ; LDL R2, 0(R1) 4
LDL R3, CURR_COLUMN ; LDL R3, 4(R1)
STL R4, CURR_MODE ; STL R4, 8(R1)
1 This statement declares an external symbol, COMM_AREA.
COMM_AREA is a global symbol that represents the base
address of a three-longword communication area that is used
by different routines in the program.
2 This statement informs the assembler that base register R1
contains the base address, COMM_AREA, of this communication
area. The next three statements define variables within the
communication area.
3 The first instruction shows how you can load registers
with constant values in the range -32,768 to +32,767 by
implicitly using R31 as the base register.
4 The last three statements show how the .BASE directive
allows you to implicitly reference base registers
and automatically compute offsets. In each of these
instructions, the second argument is defined to require
an offset and a base register.
Since no base register is specified, the assembler attempts
to imply the base register and compute the offset based upon
information given in previous .BASE directives.
In the last three instructions, the address argument is
within -32,768 to +32,767 of the base address known to
be in R1 (that is, COMM_AREA). Therefore, R1 is selected
as the base register. The assembler also computes the
correct offset from the base address known to be in R1 to
the address specified in the instruction argument.
Example 2
The assembler performs a sequential search through the list
of possible base registers, R0 through R31. It uses the first
definition possible if multiple base registers are valid. For
example:
.BASE R5, 300
:
LDQ R10, 100
The assembler outputs the LDQ instruction as follows:
LDQ R10, -200(R5)
Both R31 and R5 are defined as base registers that can be used
in constructing the instruction argument. R31 always contains
0. In this example, R5 is also known to contain the constant
300. The assembler uses the first base register, starting at
R0 and progressing to R31, which provides a known value within
-32,768 to +32,767 of the specified argument value. Since the
assembler considers R5 before it considers R31, R5 is used
rather than R31.