VMS Help  —  MACRO  /ALPHA  Directives  .BASE  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.
Close Help