Base register directive
Format
.BASE Rn [,base_expression]
1 – Parameters
Rn
One of the base registers, R0 through R30, FP, and SP.
base_expression
The base address, which is optional, and can be one of the
following:
o An absolute expression
o A relocatable expression
o An external expression
An expression must not contain forward references or implicit
external symbols. An implicitly defined external symbol is a
symbol that the assembler defaults to an external symbol. This
occurs when the assembler encounters references to a symbol, but
does not encounter a definition for the symbol or an .EXTERNAL
directive that declares the symbol.
2 – Description
The .BASE directive is used to inform the assembler that a
specified base register contains a specified base address. Later
in your program, the assembler allows you to implicitly reference
the specified base register. When the assembler knows which
base addresses are stored in one or more base registers, it can
convert an expression to an offset from one of the base registers
previously specified in a .BASE directive. .BASE provides a
convenient and more readable shorthand for accessing memory and
constant values using base registers. .BASE also makes it easier
for you to change your register assignments if you later modify
your code.
The base expression is optional. If the base expression is
specified, this base address value is assumed by the assembler
to be in the specified register, Rn. If the base expression is
omitted, the contents of the specified base register, Rn, is
considered undefined until a new base expression is associated
with the base register.
R31 is defined to always contain 0, according to the architecture
definition. Therefore, R31 is known to be a predefined base
register containing 0. For every assembly, the assembler assumes
the following statement:
.BASE R31, 0
Because the contents of R31 cannot change, you cannot specify a
base address for R31.
You can use the .BASE directive to implicitly reference base
registers. You can also automatically compute offsets from a base
address known to be in a register to a base address you use in an
instruction argument.
Most of the memory format Alpha instructions are defined
such that one of their arguments must have a base register and
an offset. If the assembler encounters only an expression with
no base register, the assembler attempts to find a base register
that contains a base address or constant within a 16-bit signed
offset of the value of the expression. If it finds such a base
register, the assembler computes an offset that, when added to
the value of the base register, results in a value equal to the
expression specified in the instruction argument.
3 – Examples
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.