VMS Help  —  MACRO  /ALPHA  Directives
    The general assembler directives provide facilities for
    performing eleven types of functions. Some directives are only
    applicable within data psects (psects with the NOEXE and NOMIX
    attributes). Other directives are only applicable within code
    psects (psects with the EXE and NOMIX attributes). All directives
    are applicable within psects that contain either data and code,
    or both (psects with the MIX attribute). For information on the
    MIX assembly-time psect and any associated restrictions, see the
    description of the .PSECT directive in this chapter.

    The following table discusses these types of functions and their
    directives.

1  –  .ADDRESS

    Address storage directive

    Format

      .ADDRESS  address-list

1.1  –  Parameter

 address-list

    A list of symbols or expressions, separated by commas (,),  which
    MACRO-64 interprets as addresses.

1.2  –  Description

    .ADDRESS stores successive quadwords (8 bytes) containing
    addresses in the object module. Digital recommends that you use
    .ADDRESS rather than .QUAD for storing address data to provide
    additional information to the linker.

1.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current (64-bit) boundary before allocating storage.

    o  You can define a 32-bit address item using macros and the
       .LONG directive. For example:

       .macro address_32 item
           .long item
       .endm address_32

1.4  –  Example

        .ADDRESS A,B,C

2  –  .ALIGN

    Location counter alignment directive

    Format

      .ALIGN  integer [,fill-specifier]

      .ALIGN  keyword [,fill-specifier]

2.1  –  Parameters

 integer

    An integer in the range 0 to 9. The location counter is aligned
    at an address that is the value of 2 raised to the power of the
    integer.

 keyword

    One of five keywords that specify the alignment boundary. The
    location counter is aligned to an address that is the next
    multiple of the following values:

    Keyword  Size (in Bytes)

    BYTE     20= 1
    WORD     21= 2
    LONG     22= 4
    QUAD     23= 8
    OCTA     24= 16

 [,fill-specifier]

    Any expression that resolves to an assembly-time integer value
    containing no forward references. The filling is done per byte,
    regardless of the alignment. If the value you specify is not in
    the range of 0 to 255, the assembler issues a diagnostic message
    and truncates the value.

2.2  –  Description

    .ALIGN aligns the location counter to the boundary specified by
    either an integer or a keyword.

2.3  –  Notes

    o  If .ALIGN is specified in a psect with the EXE and NOMIX
       attributes, the fill-specifier is ignored. The assembler
       aligns the psect to the requested boundary padding with NOP
       or FNOP instructions.

    o  If .ALIGN is specified in a psect that does not have the EXE
       attribute and a fill-specifier is specified, the assembler
       aligns the psect to the requested boundary padding, with byte
       locations using the fill-specifier as the initial value for
       the generated byte padding.

    o  If the fill-specifier expression encounters a value that is
       too large to fit in a boundary specified by the keyword, the
       data is truncated and an informational message is displayed.

    o  The alignment that you specify in .ALIGN cannot exceed the
       alignment of the psect in which the alignment is attempted
       (see the description of .PSECT). For example, if you are using
       the BYTE psect alignment and you specify .ALIGN with a word or
       larger alignment, the assembler displays an error message.

2.4  –  Examples

      Example 1

           .PSECT A,QUAD  ; Begin at quadword
        B::.BYTE 4        ; Data is byte
           .ALIGN QUAD    ; Next data is
        C::.WORD 6        ; also quadword aligned
      Example 2

           .PSECT A,EXE,NOMIX,OCTA
        L1::TRAPB:        ; offset 0
           .ALIGN OCTA    ; NOP padding bytes 4..15
            TRAPB:         ; offset 16
      Example 3

           .PSECT A,NOEXE,NOMIX,OCTA
        L1:.WORD 5        ; byte offset 0..1
           .ALIGN QUAD,2  ; fill specifier initial value
                          ; of 2 for bytes 2..7
           .WORD 6        ; byte offsets 8..9

3  –  .ASCIC

    Counted ASCII string storage directive

    Format

      .ASCIC  quoted-literal

3.1  –  Parameter

 quoted-literal

    An ASCII string delimited with double quotes.

3.2  –  Description

    .ASCIC performs the same function as .ASCII, except that .ASCIC
    inserts a count byte before the string data. The count byte
    contains the length of the string in bytes. The length given
    includes any bytes of nonprintable characters specified using the
    backslash (\) operator, but excludes the count byte.

    .ASCIC is useful in copying text because the count indicates the
    length of the text to be copied.

3.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  This directive also accepts VAX MACRO syntax.

3.4  –  Example

        .ASCIC "MY STRING"  ; In the listing, this becomes:
                            ; .BYTE 9
                            ; .ASCII \MY STRING\

4  –  .ASCID

    String-descriptor ASCII string storage directive

    Format

      .ASCID  quoted-literal

4.1  –  Parameter

 quoted-literal

    An ASCII string delimited with double quotes.

4.2  –  Description

    .ASCID performs the same function as the .ASCII directive, except
    that .ASCID inserts a string descriptor before the string data.
    The descriptor format is identical to that defined for OpenVMS
    Alpha and OpenVMS VAX. The string descriptor has the following
    format:

4.3  –  Notes

    o  String descriptors are used in calling certain system
       routines.

    o  The string-length field is two bytes in size.

    o  Descriptor information (2 bytes) is always set to ^X010E.

    o  The pointer field is a 32-bit pointer to the string (4 bytes).

    o  If natural alignment is enabled (using .ENABLE ALIGN_DATA),
       the descriptor is quadword aligned. This allows you to access
       the entire descriptor (2 data words and a longword address) on
       a quadword boundary.

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  This directive also accepts VAX MACRO syntax. See the
       VAX MACRO and Instruction Set Reference Manual for details.

4.4  –  Examples

      Example 1
        .DESCR1:   .ASCID "ARGUMENT FOR CALL"     ; String descriptor
      Example 2
        .DESCR2:   .ASCID "SECOND ARGUMENT"  ; Another string descriptor

5  –  .ASCII

    ASCII string storage directive

    Format

      .ASCII  quoted-literal

5.1  –  Parameters

 quoted-literal

    An ASCII string delimited with double quotes.

5.2  –  Description

    .ASCII stores the ASCII value of each character in the ASCII
    string or the value of each byte expression in the next available
    byte.

5.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  This directive also accepts VAX MACRO syntax. See the
       VAX MACRO and Instruction Set Reference Manual for details.

5.4  –  Examples

        .ASCII "MY STRING"

6  –  .ASCIZ

    Zero-terminated ASCII string storage directive

    Format

      .ASCIZ  quoted-literal

6.1  –  Parameter

 quoted-literal

    An ASCII string delimited with double quotes.

6.2  –  Description

    .ASCIZ performs the same function as .ASCII, except that .ASCIZ
    appends a null byte as the final character of the string. When a
    list or text string is created with an .ASCIZ directive, you need
    only perform a search for the null character in the last byte to
    determine the end of the string.

6.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  This directive also accepts VAX MACRO syntax. See the
       VAX MACRO and Instruction Set Reference Manual for details.

6.4  –  Example

        .ASCIZ "MY STRING"    ; Equivalent to
                              ; .ASCII "MY STRING \x00"

7  –  .BASE

    Base register directive

    Format

      .BASE  Rn [,base_expression]

7.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.

7.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.

7.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.

8  –  .BEGIN EXACT

    Exact instruction block directive

    Format

      .BEGIN_EXACT

8.1  –  Description

    An exact instruction block suppresses code optimizations
    (SCHEDULE and PEEPHOLE) regardless if these optimizations are
    enabled for the assembly unit. Unlike .ENABLE and .DISABLE, which
    can be used to enable or disable specific optimizations for the
    entire assembly unit, .BEGIN_EXACT and .END_EXACT allow you to
    suppress optimization for a specified range of instructions.
    Instructions outside the specified range remain subject to any
    optimizations you have enabled.

8.2  –  Notes

    o  This directive cannot appear in a psect with the NOEXE and
       NOMIX attributes.

    o  Although this directive is accepted by the assembler in a
       psect with the MIX attribute, it has no effect in these psects
       since no code optimizations are in affect for MIX psects.

    o  .BEGIN_EXACT must be paired with a matching .END_EXACT to
       close the exact instruction block.

    o  .BEGIN_EXACT and .END_EXACT instruction blocks can be
       nested. The outermost level of the .BEGIN_EXACT and matching
       .END_EXACT directives delimit the actual exact instruction
       block from which code optimizations are suppressed. Nesting
       .BEGIN_EXACT and .END_EXACT instruction blocks can be useful
       in macro definitions where the macro expansion requires an
       exact instruction sequence. Nested .BEGIN_EXACT and .END_EXACT
       instruction blocks allow a macro to be invoked both from
       within and without the exact instruction block.

    o  .BEGIN_EXACT does not affect automatic alignment. Automatic
       alignment is enabled with the .ENABLE ALIGN_CODE and .ENABLE
       ALIGN_DATA directives or with the /ALIGN=(CODE,DATA) command-
       line qualifier.

8.3  –  Examples

      The following example shows an instruction sequence prior to
      optimization:

             addf f7, f8, f9     ; 1
             addf f2, f3, f4     ; 2
             addl r5, r6, r7     ; 3
             addl r8, r9, r10    ; 4

      The assembler optimizes the previous example to a sequence
      similar to the following instruction sequence:

                     :
             addf f7, f8, f9     ; 1
             addl r5, r6, r7     ; 3
             addf f2, f3, f4     ; 2
             addl r8, r9, r10    ; 4
                     :

      If you choose to suppress optimization in the previous example,
      enclose the four instructions with the .BEGIN_EXACT and
      .END_EXACT directives, as shown in the following example:

             .BEGIN_EXACT
             addf f7, f8, f9     ; 1
             addf f2, f3, f4     ; 2
             addl r5, r6, r7     ; 3
             addl r8, r9, r10    ; 4
             .END_EXACT

9  –  .BLKx

    Block storage allocation directives

    Format

      .BLKA  [expression]

      .BLKB  [expression]

      .BLKD  [expression]

      .BLKF  [expression]

      .BLKG  [expression]

      .BLKL  [expression]

      .BLKO  [expression]

      .BLKQ  [expression]

      .BLKS  [expression]

      .BLKT  [expression]

      .BLKW  [expression]

9.1  –  Parameter

 expression

    An integer expression specifying the amount of storage to be
    allocated. All the symbols in the expression must be defined
    at the current point in the assembly and the expression must be
    an absolute expression. If the expression is omitted, a default
    value of 1 is assumed.

9.2  –  Description

    MACRO-64 has the following 11 block storage directives:

    DirectivReserves Storage for:  Bytes Allocated

    .BLKA   Addresses (quadwords)  8 * value of expression
    .BLKB   Byte data              Value of expression
    .BLKD   Double-precision       8 * value of expression
            floating-point data
            (quadwords)
    .BLKF   Single-precision       4 * value of expression
            floating-point data
            (longwords)
    .BLKG   G_floating data        8 * value of expression
            (quadwords)
    .BLKL   Longword data          4 * value of expression
    .BLKO   Octaword data          16 * value of expression
    .BLKQ   Quadword data          8 * value of expression
    .BLKS   S_floating data        4 * value of expression
            (longwords)
    .BLKT   T_floating data        8 * value of expression
            (quadwords)
    .BLKW   Word data              2 * value of expression

    Each directive reserves storage for a different data type. The
    value of the expression determines the number of data items for
    which MACRO-64 reserves storage. For example, .BLKL 4 reserves
    storage for 4 longwords of data and .BLKB 2 reserves storage for
    2 bytes of data. The total number of bytes reserved is equal to
    the length of the data type times the value of the expression.

9.3  –  Notes

    o  If automatic data alignment is enabled, the .BLKx directives
       align the current location counter to one of the alignments
       listed in the following table:

       DirectiAlignment

       .BLKA  Quadword (64-bit) boundary
       .BLKB  None
       .BLKD  Quadword (64-bit) boundary
       .BLKF  Longword (32-bit) boundary
       .BLKG  Quadword (64-bit) boundary
       .BLKL  Longword (32-bit) boundary
       .BLKO  Octaword (128-bit) boundary
       .BLKQ  Quadword (64-bit) boundary
       .BLKS  Longword (32-bit) boundary
       .BLKT  Quadword (64-bit) boundary
       .BLKW  Word (16-bit) boundary

    o  You can only use these directives within psects having either
       the NOEXE or MIX attributes.

9.4  –  Example

            .PSECT A,NOEXE
        B:: .BLKW  10             ; 10 words (20 bytes) of storage
            .BLKQ   5             ; 5 quadwords (40 bytes) of storage

            .BLKW                 ; 1 word (2 bytes) of storage

10  –  .BYTE

    Byte storage directive

    Format

      .BYTE  expression-list

10.1  –  Parameter

 expression-list

    One or more expressions separated by commas. Each expression
    is first evaluated as a quadword expression; then the value of
    the expression is truncated to fit in a byte. The value of each
    expression should be in the range 0 to 255 for unsigned data or
    in the range -128 to +127 for signed data.

10.2  –  Description

    .BYTE generates successive bytes of binary data in the object
    module.

10.3  –  Notes

    o  The assembler displays a warning message if the expression is
       outside the range -128 to -255.

    o  The assembler will truncate the most significant bits of an
       integer or external value that is too large to store in eight
       bits.

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

10.4  –  Example

        A:      .BYTE   5       ; Stores 5 in a byte

11  –  .CODE ADDRESS

    Code address storage directive

    Format

      .CODE_ADDRESS  name-list

11.1  –  Parameter

 name-list

    A list of symbols separated by commas. These symbols should
    reference either a procedure descriptor name, such as a routine
    name, or an externally defined procedure descriptor.

11.2  –  Description

    .CODE_ADDRESS causes the code addresses of the specified
    identifiers to be placed at the current psect and current
    location counter. The specified identifier should reference a
    procedure descriptor defined in the image.

11.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a quadword (64-bit) boundary
       before allocating storage.

11.4  –  Example

        .CODE_ADDRESS A

12  –  .D FLOATING

    Floating-point storage directive

    Format

      .D_FLOATING  floating-point-number-list

      .DOUBLE  floating-point-number-list

12.1  –  Parameter

 floating-point-number-list

    A comma-separated list of floating-point constants. The constants
    cannot contain any operators except unary plus or unary minus.

12.2  –  Description

    .D_FLOATING evaluates the specified floating-point constants and
    stores the results in the object module. .D_FLOATING generates
    64-bit, double-precision floating-point data (1 bit of sign, 8
    bits of exponent, and 55 bits of fraction). See the description
    of .F_FLOATING for information on storing single-precision
    floating-point numbers and the descriptions of .G_FLOATING, .S_
    FLOATING, and .T_FLOATING for descriptions of other floating-
    point constants.

12.3  –  Notes

    o  Double-precision floating-point numbers are always rounded.

    o  The alternate form of .D_FLOATING is .DOUBLE.

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a quadword (64-bit) boundary
       before allocating storage.

    o  The Alpha architecture supports only conversion operations
       for the
       D floating-point data type.

12.4  –  Example

        .D_FLOATING  3.1E+02

13  –  .DEFINE FREG

    Define floating-point register symbol directive

    Format

      .DEFINE_FREG  regsym regnum

13.1  –  Parameters

 regsym

    A MACRO-64 identifier.

 regnum

    An assembly-time expression or a currently defined register
    symbol.

13.2  –  Description

    The identifier you specify as the first argument to .DEFINE_FREG
    becomes a floating-point register symbol. Thereafter, it cannot
    be used as a MACRO-64 identifier. Specifically, the user-defined
    register symbol is only allowed where a register is allowed. In
    this sense, the user-defined register symbol is reserved until
    the end of the assembly unit or until you delete its definition
    (see .UNDEFINE_REG), whichever occurs first.

    The second argument to .DEFINE_FREG can be either an integer
    expression or a currently defined floating-point register symbol.
    An integer expression indicates the register number to assign
    to the register symbol. The expression can contain no forward
    or external references and must be in the range of 0 to 31.
    Alternatively, you can define a register symbol in terms of
    another currently defined register symbol. A currently defined
    register symbol is a predefined register symbol or a register
    symbol that you have previously defined. In this case, the new
    register symbol you specify with the first argument receives the
    current value of the register symbol you specify with the second
    argument.

13.3  –  Notes

    o  You cannot define a floating-point register in terms of an
       integer register and vice versa.

    o  You cannot redefine a currently defined register symbol with a
       different register number. To redefine a register symbol, you
       must first delete the old definition with the .UNDEFINE_REG
       directive.

13.4  –  Example

            .DEFINE_IREG A0     16      ; A0 is integer register 16
            .DEFINE_IREG A1     R17     ; A1 is integer register 17,
                                        ;  defined in terms of the
                                        ;  predefined R17 register symbol
            .DEFINE_IREG PTR    A0      ; PTR is integer register 16,
                                        ;  defined in terms of the
                                        ;  previously-defined A0 register
                                        ;  symbol
            .DEFINE_FREG $F0    0       ; $F0 is floating register 0
            .DEFINE_FREG $F1    F1      ; $F1 is floating register 1,
                                        ;  defined in terms of the
                                        ;  predefined F1 register symbol
            .DEFINE_FREG RADIUS $F1     ; RADIUS is floating register 1,
                                        ;  defined in terms of the
                                        ;  previously defined $F1
                                        ;  register symbol
            .DEFINE_IREG X1     R5      ; X1 is integer register 5,
                                        ;  defined in terms of the
                                        ;  predefined R5 register symbol
            .DEFINE_IREG X1     5       ; 2nd definition is the same
                                        ;  value, so no diagnostic
                                        ;  results
            .DEFINE_IREG X1     7       ; Warning: redefinition with a
                                        ;  different value
            .DEFINE_IREG X2     F5      ; Error: cannot define an integer
                                        ;  register in terms of a
                                        ;  floating register

            LDQ         R1, (PTR)       ; LDQ R1, (R16)
            LDG         RADIUS, (A1)    ; LDG F1, (R17)

14  –  .DEFINE IREG

    Define integer register symbol directive

    Format

      .DEFINE_IREG  regsym regnum

14.1  –  Parameters

 regsym

    A MACRO-64 identifier.

 regnum

    An assembly-time expression or a currently defined register
    symbol.

14.2  –  Description

    The identifier you specify as the first argument to .DEFINE_IREG
    becomes an integer register symbol. Thereafter, it cannot be
    used as a MACRO-64 identifier. Specifically, the user-defined
    register symbol is only allowed where a register is allowed. In
    this sense, the user-defined register symbol is reserved until
    the end of the assembly unit or until you delete its definition
    (see .UNDEFINE_REG), whichever occurs first.

    The second argument to .DEFINE_IREG can be either an integer
    expression or a currently defined integer register symbol.
    An integer expression indicates the register number to assign
    to the register symbol. The expression can contain no forward
    or external references and must be in the range of 0 to 31.
    Alternatively, you can define a register symbol in terms of
    another, currently defined register symbol. A currently defined
    register symbol is a predefined register symbol or a register
    symbol that you have previously defined. In this case, the new
    register symbol you specify with the first argument receives the
    current value of the register symbol you specify with the second
    argument.

14.3  –  Notes

    o  You cannot define an integer register in terms of a floating-
       point register and vice versa.

    o  You cannot redefine a currently defined register symbol with a
       different register number. To redefine a register symbol, you
       must first delete the old definition with the .UNDEFINE_REG
       directive.

14.4  –  Example

      Refer to the example in .DEFINE_FREG.

15  –  .DISABLE

    Disable assembler functions directive

    Format

      .DISABLE  argument-list

      .DSABL  argument-list

15.1  –  Parameter

 argument-list

    One or more of the symbolic arguments listed in the description
    of .ENABLE. You can use either the long or the short form of the
    symbolic arguments. If you specify multiple arguments, separate
    them by commas, spaces, or tabs.

15.2  –  Description

    .DISABLE disables the specified assembler function. See the
    description of .ENABLE for more information.

    The alternate form of .DISABLE is .DSABL.

16  –  .ELSE

    Conditional assembly block directive

    Format

      .ELSE

16.1  –  Description

    A conditional assembly block is a series of source statements
    that is assembled only if a certain condition is met. .IF starts
    the conditional block and .ENDC ends the conditional block; each
    .IF must have a corresponding .ENDC. The .IF directive contains
    a condition test and one or two arguments. The condition test
    specified is applied to the arguments. If the test is met, all
    MACRO-64 statements between .IF and .ELSE are assembled. If
    the test is not met, the statements between .ELSE and .ENDC are
    assembled.

    Conditional blocks can be nested; that is, a conditional block
    can be inside another conditional block. In this case, the
    statements in the inner conditional block are assembled only
    if the condition is met for both the outer and inner block. For
    more information, see the description of the .IF directive.

16.2  –  Notes

    o  You cannot use the .ELSE directive in the same conditional
       block as the .IF_x directive.

    o  The .ELSE directive is similar to the .IF_FALSE directive.
       However, you can only use .ELSE once within a conditional
       block. .IF_FALSE can be used any number of times in a
       conditional block.

16.3  –  Example

      Here is an example of a conditional assembly directive:

        .IF EQUAL  ALPHA+1        ; Assemble block if ALPHA+1=0.
          .
          .
        .ELSE                     ; Assemble when .IF=false.
          .
          .
        .ENDC

17  –  .ENABLE

    Enable assembler functions directive

    Format

      .ENABLE  argument-list

      .ENABL  argument-list

17.1  –  Parameter

 argument-list

    One or more of the symbolic arguments You can use either the long
    form or the short form of the symbolic arguments.

    If you specify multiple arguments, separate them with commas,
    spaces, or tabs.

    Table 6 .ENABLE and .DISABLE Symbolic Arguments

                Short  Default
    Long Form   Form   Condition  Function

    ALIGN_CODE         Disabled The code alignment option aligns
                              certain branch target labels. The
                              ALIGN_CODE option is disabled for
                              the assembly unit if any one of the
                              following is true:

                              o  /NOALIGNMENT=CODE is specified on
                                 the command line.

                              o  .DISABLE ALIGN_CODE is specified in
                                 the source program.

                              o  The /ALIGNMENT=CODE option is
                                 defaulted.

    ALIGN_DATA         Disabled When ALIGN_DATA is disabled, the data-
                              storage directives put each succeeding
                              item on the next byte boundary.

                              When ALIGN_DATA is enabled, the data-
                              storage directives put each succeeding
                              item on natural boundaries (such as
                              words on word boundaries, longwords on
                              longword boundaries) and add pad bytes
                              as necessary.

                              Accessing data on anything other than
                              natural boundaries usually incurs a
                              significant performance penalty.

                              You can enable or disable the
                              ALIGN_DATA option for specific ranges
                              within your program.

    FLOAT              Enabled Controls whether the assembler
                              generates floating-point instructions
                              when optimizing code and performing
                              code-label alignment.

                              Currently, the only floating-point
                              instruction generated by the assembler
                              during optimization and alignment
                              processing is FNOP, the floating-
                              point no-operation instruction. If you
                              specify .DISABLE FLOAT, the assembler
                              does not generate any floating-point
                              instructions as part of optimization
                              and alignment processing.

                              The initial value of this option is
                              specified by the /ENVIRONMENT=[NO]FLOAT
                              command-line option. The last value of
                              the FLOAT option at the end of assembly
                              determines whether FLOAT is enabled or
                              DISABLED.

    GLOBAL      GBL    Enabled When GLOBAL is enabled, the assembler
                              implicitly treats any undefined symbol
                              as an external reference defined in
                              another module. If the GLOBAL option
                              is disabled, the assembler issues
                              a warning and implicitly treats
                              the undefined symbol as an external
                              reference assumed to be defined in
                              another module. The last value of the
                              GLOBAL option at the end of assembly
                              determines whether the GLOBAL option is
                              enabled or disabled.

    LOCAL_BLOCK LSB    Disabled Used to override the default assembler
                              behavior to define a temporary label
                              block. (A temporary label is of the
                              form n$ where n represents a number.)
                              A temporary label block is usually
                              delimited by two user-defined local
                              or global labels. However, the .ENABLE
                              LOCAL_BLOCK directive defines the start
                              of a block that is terminated by one of
                              the following:

                              o  A second .ENABLE LOCAL_BLOCK
                                 directive.

                              o  A .DISABLE LOCAL_BLOCK directive
                                 followed by a user-defined local or
                                 global label, or a .PSECT directive.

    PEEPHOLE           Disabled Peephole optimization reduces the
                              strength of certain instructions and
                              eliminates instructions where possible.
                              The PEEPHOLE option is disabled for
                              the assembly unit if any one of the
                              following is true:

                              o  /NOOPTIMIZE=PEEPHOLE is specified on
                                 the command line.

                              o  .DISABLE PEEPHOLE is specified in
                                 the source program.

                              o  The PEEPHOLE option is defaulted.

    PREPROCESSOR_      Enabled When PREPROCESSOR_OUTPUT is enabled,
    OUTPUT                    the MACRO-64 preprocessor processes
                              your source statements and outputs to
                              the preprocessor-output file. If the
                              PREPROCESSOR_OUTPUT option is disabled,
                              your source statements are processed
                              as before. However, output of these
                              statements to the preprocessor-output
                              file is suppressed.

                              Neither .ENABLE PREPROCESSOR_OUTPUT
                              nor .DISABLE PREPROCESSOR_OUTPUT is
                              passed through to the preprocessor-
                              output file. These two directives
                              have no effect unless you specify
                              /PREPROCESSOR_ONLY on the command line.

    SCHEDULE           Disabled Instruction scheduling optimization
                              reorders instructions to more optimally
                              utilize the instruction pipeline.
                              The SCHEDULE option is disabled for
                              the assembly unit if any one of the
                              following is true:

                              o  /NOOPTIMIZE=SCHEDULE is specified on
                                 the command line.

                              o  .DISABLE SCHEDULE is specified in
                                 the source program.

                              o  The SCHEDULE option is defaulted.

17.2  –  Description

    .ENABLE enables the specified assembly function. .ENABLE and
    its negative form, .DISABLE, control the following assembler
    functions:

    o  Creating local label blocks

    o  Specifying that undefined symbol references are external
       references

    o  Enabling or disabling specific optimizations for the assembly
       unit

    You can enable one or more specific optimization options with
    either the .ENABLE directive or the /OPTIMIZE command-line
    qualifier, or both. If you explicitly disable one or more
    specific optimization options with the .DISABLE directive, those
    optimization options are disabled regardless of the command-line
    options you specify.

17.3  –  Notes

    o  The alternate form of .ENABLE is .ENABL.

17.4  –  Examples

      Example 1
      The following example shows the ALIGN_DATA option:

        .PSECT A, NOEXE
        .ENABLE ALIGN_DATA  ; Align on natural
                            ; natural boundaries
        A: .BYTE 1          ;
        B: .QUAD 1000       ; B is allocated at
                            ; a natural boundary -
                            ; specifically at A + 7
        .DISABLE ALIGN_DATA ;
        C: .BYTE 2          ;
        D: .QUAD 1001       ; D is allocated at
                            ; an unaligned boundary -
                            ; specifically C + 1
      Example 2
      The following example shows the GLOBAL option disabled:

        .DISABLE GLOBAL
        .ADDRESS X         ; Assembler issues a warning
        .END
      Example 3
      The following example shows the LOCAL_BLOCK option enabled:

              .ENABLE LOCAL_BLOCK

              .PSECT A,NOEXE
        A1::
        5$:   .PROCEDURE_DESCRIPTOR PROC_1   ; Temporary label 5$
              .blkb 32
        A2::
              .address 5$         ; By default the declaration
                                  ; of A2 would have ended the
                                  ; temporary label block and
                                  ; made this reference to 5$
                                  ; illegal.  However, this default
                                  ; behavior has been overridden
                                  ; by the use of .ENABLE LOCAL_BLOCK.

              .DISABLE LOCAL_BLOCK
              .END
      Example 4
      The following example shows an unoptimized and optimized list
      of instructions with the SCHEDULE and PEEPHOLE options enabled:

        .ENABLE PEEPHOLE,SCHEDULE
        .psect A,EXE,QUAD     ; unoptimized
        TRAPB
        A::ADDF F1,F2,F3
           ADDF F4,F5,F6
           ADDL R1,R2,R3
           ADDL R4,R5,R6

      This example shows the optimized list of instructions:

        .ENABLE PEEPHOLE,SCHEDULE
        .psect A,EXE,QUAD     ; optimized
        A::ADDF F1,F2,F3
           ADDL R1,R2,R3
           ADDF F4,F5,F6
           ADDL R4,R5,R6

      The following example shows a repeat block that initializes
      a block of 1000 longwords to the values of 0 through 999. The
      .DISABLE PREPROCESSOR_OUTPUT directive suppresses from the
      preprocessor output file those statements that are incompatible
      with the OSF/1 Assembler.

        .DISABLE PREPROCESSOR_OUTPUT
         I=0
        .REPEAT 1000
           .ENABLE PREPROCESSOR_OUTPUT
           .LONG %INTEGER(I)
           .DISABLE PREPROCESSOR_OUTPUT
           I = I + 1
        .ENDR

18  –  .END

    Assembly termination directive

    Format

      .END  [label]

18.1  –  Parameter

 label

    The procedure descriptor name that specifies the routine (called
    the transfer address) where program execution begins. This
    argument is optional.

18.2  –  Description

    .END terminates the source program. No additional text should
    occur beyond this point in the current source file, or in any
    additional source files specified in the command line for this
    assembly. If any additional text does occur, the assembler
    ignores it. The additional text does not appear in the listing
    file nor does it affect the object file.

18.3  –  Notes

    o  When an executable image consisting of several object modules
       is linked, only one object module should be terminated by an
       .END directive that specifies a transfer address. All other
       object modules should be terminated by .END directives that
       do not specify a transfer address. If an executable image
       contains either no transfer address or more than one transfer
       address, the linker displays an error message.

    o  For more information, see the .PROCEDURE_DESCRIPTOR directive.

18.4  –  Example

          .
          .
          .
        .PROCEDURE_DESCRIPTOR TRANSFER1,code_address_T1
          .
          .
          .
        .END TRANSFER1        ; TRANSFER1 is module transfer address

19  –  .ENDC

    End conditional directive

    Format

      .ENDC

19.1  –  Description

    .ENDC terminates the conditional range started by the .IF
    directive. See the description of .IF for more information and
    examples.

20  –  .ENDM

    End macro definition directive

    Format

      .ENDM  [macro-name]

20.1  –  Parameter

 macro-name

    The name of the macro whose definition is to be terminated. The
    macro name is optional; if specified, it must match the name
    defined in the matching .MACRO directive. The macro name should
    be specified so that the assembler can detect any improperly
    nested macro definitions.

20.2  –  Description

    .ENDM terminates the macro definition. See the description of
    .MACRO for an example that uses an .ENDM directive.

20.3  –  Notes

    o  If .ENDM is encountered outside a macro definition, the
       assembler displays an error message.

21  –  .ENDR

    End repeat range directive

    Format

      .ENDR

21.1  –  Description

    .ENDR indicates the end of a repeat range. It must be the final
    statement of every repeat block. A repeat block consists of
    any range of text beginning with the .IRP, .IRPC, or .REPEAT
    directive. For more information, see the description for the
    .IRP, .IRPC, or .REPEAT directives for examples of how to use the
    .ENDR directive.

21.2  –  Notes

    o  If .ENDR is encountered outside a repeat block, the assembler
       displays an error message.

22  –  .END EXACT

    End exact instruction block directive

    Format

      .END_EXACT

22.1  –  Description

    .END_EXACT delimits the end of an exact instruction block. An
    exact instruction block suppresses the SCHEDULE and PEEPHOLE
    optimizations for the specified range of instructions regardless
    if code optimizations are enabled for the assembly unit.

    For more information on the .END_EXACT directive, see the
    description of the .BEGIN_EXACT directive in this chapter.

23  –  .ERROR

    Error directive

    Format

      .ERROR  quoted-literal

23.1  –  Parameter

 quoted-literal

    A string of characters, between a pair of double quotes,
    displayed during assembly.

23.2  –  Description

    .ERROR causes the assembler to display an error message on the
    terminal or batch log file and in the listing file (if there is
    one).

    Using .ERROR prevents an output object file from being produced.

23.3  –  Notes

    o  .PRINT, .WARN, and .ERROR are directives used to display
       messages. You can use them to display information indicating
       unexpected or important conditions within the assembly.

    o  This directive also accepts VAX MACRO syntax. See the
       VAX MACRO and Instruction Set Reference Manual for details.

23.4  –  Example

        .ERROR "Illegal Arguments"
        ^
        %MACRO64-E-GENERROR, Generated ERROR: Illegal Arguments
        at line number 3 in file DISK$:[TEST]ERROR.M64;2

24  –  .EVEN

    Even location counter alignment directive

    Format

      .EVEN

24.1  –  Description

    .EVEN ensures that the current value of the location counter
    is even by adding 1 if the current value is odd. If the current
    value is already even, no action is taken.

24.2  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

25  –  .EXTERNAL

    External symbol attribute directive

    Format

      .EXTERNAL  symbol-list

      .EXTRN  symbol-list

25.1  –  Parameter

 symbol-list

    A list of symbol names separated by commas.

25.2  –  Description

    .EXTERNAL indicates that the specified symbols are external; that
    is, the symbols are defined in another object module.

25.3  –  Notes

    o  The alternate form of .EXTERNAL is .EXTRN.

25.4  –  Example

             .EXTERNAL B    ; B is defined in another module
                .
                .
                .
        A::  .ADDRESS B    ; Its address is stored here

26  –  .F FLOATING

    Floating-point storage directive

    Format

      .F_FLOATING  floating-point-number-list

      .FLOAT  floating-point-number-list

26.1  –  Parameter

 floating-point-number-list

    A list of one or more floating-point constants separated by
    commas. The constants cannot contain any operators except unary
    plus or unary minus.

26.2  –  Description

    .F_FLOATING evaluates the specified floating-point constant(s)
    and stores the results in the object module. .F_FLOATING
    generates 32-bit, single-precision, floating-point data (1
    bit of sign, 8 bits of exponent, and 23 bits of fractional
    significance). See the description of .D_FLOATING for information
    on storing double-precision floating-point constants and the
    descriptions of .G_FLOATING, S_FLOATING, and T_FLOATING for
    descriptions of other floating-point constants.

26.3  –  Notes

    o  The alternate form of .F_FLOATING is .FLOAT.

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a longword (32-bit) boundary
       before allocating storage.

26.4  –  Example

        .F_FLOATING 1.0,3.0E+2

27  –  .G FLOATING

    G_floating-point storage directive

    Format

      .G_FLOATING  floating-point-number-list

27.1  –  Parameter

 floating-point-number-list

    A comma-separated list of one or more floating-point constants.
    The constants cannot contain any operators except unary plus or
    unary minus.

27.2  –  Description

    .G_FLOATING evaluates the specified floating-point constants and
    stores the results in the object module. .G_FLOATING generates
    64-bit data (1 bit of sign, 11 bits of exponent, and 52 bits of
    fraction). See the description of .D_FLOATING for information
    on storing double-precision floating-point constants and the
    descriptions of .F_FLOATING, S_FLOATING, and T_FLOATING for
    descriptions of other floating-point constants.

27.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a quadword (64-bit) boundary
       before allocating storage.

27.4  –  Example

        .G_FLOATING  2.0E-3

28  –  .IDENT

    Identification directive

    Format

      .IDENT  quoted-literal

28.1  –  Parameter

 quoted-literal

    A 1- to 31-character string, within double quotes, that
    identifies the module, such as a string that specifies a version
    number.

28.2  –  Description

    .IDENT provides a means of identifying the object module. This
    identification is in addition to the name assigned to the object
    module with .TITLE. You can specify a character string in .IDENT
    to label the object module. This string is printed in the header
    of the listing file and also appears in the object module.

28.3  –  Notes

    o  If a source module contains more than one .IDENT, the last
       directive given establishes the character string that forms
       part of the object module identification.

    o  This directive also accepts VAX MACRO syntax. See the
       VAX MACRO and Instruction Set Reference Manual for details.

28.4  –  Example

        .IDENT "Module Name"

29  –  .IF

    Conditional assembly block directive

    Format

      .IF  condition argument(s)
         .

         .

         .

      range
         .

         .

         .

      .ENDC

29.1  –  Parameters

 condition

    A specified condition that must be met if the block is to be
    included in the assembly. The condition must be separated from
    the argument by a comma, space, or tab.

 argument(s)

    One or more symbolic arguments or expressions of the specified
    conditional test. If the argument is an expression, it cannot
    contain any undefined symbols. The assembler converts relocatable
    arguments to absolute arguments by discarding the relocatable
    portion of the expression and using only the offset from the
    beginning of the psect. Arguments must be separated by a comma.

 range

    The block of source code that is conditionally included in the
    assembly.

    Table 7 Condition Tests for Conditional Assembly Directives

                                                             Condition
    Condition       Complement                     Number    That
    Test            Condition           Argument   of        Assembles
                    Test                Type       Arguments Block

    Long      Short               Short
    Form      Form  Long Form     Form

    EQUAL     EQ    NOT_EQUAL     NE    Expression 1 or 2    Expression-
                                                             1 is
                                                             equal to
                                                             expression-
                                                             2 or not
                                                             equal to
                                                             expression-
                                                             2.
    GREATER   GT    LESS_EQUAL    LE    Expression 1 or 2    Expression-
                                                             1 is
                                                             greater
                                                             than
                                                             expression-
                                                             2 or
                                                             less
                                                             than or
                                                             equal to
                                                             expression-
                                                             2.
    LESS_     LT    GREATER_      GE    Expression 1 or 2    Expression-
    THAN            EQUAL                                    1 is
                                                             less
                                                             than
                                                             expression-
                                                             2 or
                                                             greater
                                                             than or
                                                             equal to
                                                             expression-
                                                             2.
    DEFINED   DF    NOT_DEFINED   NDF   Symbolic   1         Symbol
                                                             is
                                                             defined
                                                             or not
                                                             defined.
    BLANK     B     NOT_BLANK     NB    Macro      1         Argument
                                                             is blank
                                                             or not
                                                             blank.
    IDENTICAL IDN   DIFFERENT     DIF   Macro      2         Arguments
                                                             are
                                                             identi-
                                                             cal or
                                                             differ-
                                                             ent.

29.2  –  Description

    A conditional assembly block is a series of source statements
    that are assembled only if a certain condition is met. A .IF
    starts the conditional block and a .ENDC ends the conditional
    block; each .IF must have a corresponding .ENDC. The .IF
    directive contains a condition test and one or two arguments.
    The condition test specified is applied to the arguments. If
    the test is met, all MACRO-64 statements between .IF and .ENDC
    are assembled. If the test is not met, the statements are not
    assembled. Optionally, you can use the .ELSE directive (or a
    combination of the .IFF, .IFT, and .IFTF directives) to specify
    an alternate series of statements to assemble if the test is not
    met.

    You can nest conditional blocks; that is, a conditional block
    can be inside another conditional block. In this case, the
    statements in the inner conditional block are assembled only
    if the condition is met for both the outer and inner block.

29.3  –  Notes

    o  The assembler displays an error message if the following
       directives occur outside a conditional assembly block: .ENDC,
       .ELSE, .IF_FALSE, .IF_TRUE, .IF_TRUE_FALSE.

    o  MACRO-64 permits a nesting depth of 100 conditional assembly
       levels. If a statement attempts to exceed this nesting level
       depth, the assembler displays an error message.

    o  The effect of logical expressions can only be achieved by
       using several levels of .IF directives. See Example 5.

    o  Lowercase string arguments are converted to uppercase before
       being compared, unless the string is surrounded by double
       quotes or /NAMES=AS_IS is specified on the command line.

    o  The assembler displays an error message if .IF specifies any
       of the following: a condition test other than those which are
       valid, an illegal argument, or a null argument specified in an
       .IF directive.

29.4  –  Examples

      Example 1
      Here is an example of a conditional assembly directive:

        .IF EQUAL  ALPHA+1        ; Assemble block if ALPHA+1=0. Do
          .                       ;   not assemble if ALPHA+1 not=0
          .
          .
        .ENDC
      Example 2
      Nested conditional directives take the following form:

        .IF   condition argument(s)
        .IF   condition argument(s)
          .
          .
          .
        .ENDC
        .ENDC
      Example 3
      The following conditional directives can govern whether
      assembly of the specified range is to occur:

        .IF DEFINED  SYM1
        .IF DEFINED  SYM2
          .
          .
          .
        .ENDC
        .ENDC

      In this example, if the outermost condition is not satisfied,
      no deeper level of evaluation of nested conditional statements
      within the program occurs. Therefore, both SYM1 and SYM2 must
      be defined for the specified range to be assembled.
      Example 4
      An alternate series of statements can be specified using .ELSE.

        .IF EQUAL A,B        ; Assemble if A is equal to B
        .ELSE                ; Assemble if A is not equal to B
        .ENDC

      Example 5
      The following example demonstrates the use of .ELSE and
      nesting:

        .IF LESS_THAN X,Y  ; Assemble if X is less than Y
           .IF DEFINED Z   ; Assemble if Z is defined and
                           ;  X is less than Y
           .ELSE           ; Assemble if Z is not defined and
                           ;  X is less than Y
           .ENDC
        .ELSE              ; Assemble if X is greater than or equal to Y
           .IF DEFINED Z   ; Assemble if Z is defined and X is
                           ;  greater than or equal to Y
           .ENDC
        .ENDC

30  –  .IF x

    Subconditional assembly block directives

    Format

      .IF_FALSE

      .IF_TRUE

      .IF_TRUE_FALSE

30.1  –  Description

    For compatibility with VAX MACRO, MACRO-64 provides three
    directives for use within .IF blocks:

    Directive     Function

    .IF_FALSE     If the condition of the assembly block tests false,
                  the program includes the source code following
                  the .IF_FALSE directive and continuing up to the
                  next subconditional directive or to the end of the
                  conditional assembly block.
    .IF_TRUE      If the condition of the assembly block tests true,
                  the program includes the source code following
                  the .IF_TRUE directive and continuing up to the
                  next subconditional directive or to the end of the
                  conditional assembly block.
    .IF_TRUE_     Regardless of whether the condition of the
    FALSE         assembly block tests true or false, the source
                  code following the .IF TRUE_FALSE directive (and
                  continuing up to the next subconditional directive
                  or to the end of the assembly block) is always
                  included.

    The implied argument of a subconditional directive is the
    condition test specified when the conditional assembly block was
    entered. A conditional or subconditional directive in a nested
    conditional assembly block is not evaluated if the preceding (or
    outer) condition in the block is not satisfied (see Example 3 and
    Example 4).

    A conditional block with a subconditional directive is different
    from a nested conditional block. If the condition in the .IF is
    not met, the inner conditional blocks are not assembled, but a
    subconditional directive can cause a block to be assembled.

30.2  –  Notes

    o  If a subconditional directive appears outside a conditional
       assembly block, the assembler displays an error message.

    o  The alternate forms of .IF_FALSE, .IF_TRUE, and .IF_TRUE_FALSE
       are .IFF, .IFT, and .IFTF.

    o  You cannot use .ELSE in the same conditional block as .IF_x.

30.3  –  Examples

      Example 1
      Assume that symbol SYM is defined:

           .IF DEFINED   SYM     ; Tests TRUE since SYM is defined.
             .                   ;   Assembles the following code.
             .
             .
           .IF_FALSE             ; Tests FALSE since previous
             .                   ;   .IF was TRUE.  Does not
             .                   ;   assemble the following code.
             .
           .IF_TRUE              ; Tests TRUE since SYM is defined.
             .                   ;   Assembles the following code.
             .
             .
           .IF_TRUE_FALSE        ; Assembles following code
             .                   ;   unconditionally.
             .
             .
           .IF_TRUE              ; Tests TRUE since SYM is defined.
             .                   ;   Assembles remainder of
             .                   ;   conditional assembly block.
             .
           .ENDC
      Example 2
      Assume that symbol X is defined and that symbol Y is not
      defined:

           .IF DEFINED  X        ; Tests TRUE since X is defined.
           .IF DEFINED  Y        ; Tests FALSE since Y is not defined.
           .IF_FALSE             ; Tests TRUE since Y is not defined.
             .                   ;   Assembles the following code.
             .
             .
           .IF_TRUE              ; Tests FALSE since Y is not defined.
             .                   ;   Does not assemble the following
             .                   ;   code.
             .
           .ENDC
           .ENDC
      Example 3
      Assume that symbol A is defined and that symbol B is not
      defined:

           .IF DEFINED  A       ; Tests TRUE since A is defined.
             .                  ;   Assembles the following code.
             .
             .
           .IF_FALSE            ; Tests FALSE since A is defined.
             .                  ;   Does not assemble the following
             .                  ;   code.
             .
           .IF NOT_DEFINED B    ; Nested conditional directive
             .                  ;   is not evaluated.
             .
             .
           .ENDC
           .ENDC
      Example 4
      Assume that symbol X is not defined but symbol Y is defined:

           .IF DEFINED  X       ; Tests FALSE since X is not defined.
             .                  ;   Does not assemble the following
             .                  ;   code.
             .
           .IF DEFINED  Y       ; Nested conditional directive
             .                  ;   is not evaluated.
             .
             .
           .IF_FALSE            ; Nested subconditional
             .                  ;   directive is not evaluated.
             .
             .
           .IF_TRUE             ; Nested subconditional
             .                  ;   directive is not evaluated.
             .
             .
           .ENDC
           .ENDC

31  –  .IIF

    Immediate conditional assembly block directive

    Format

      .IIF  condition [,]argument(s), statement

31.1  –  Parameters

 condition

    One of the legal condition tests defined for conditional assembly
    blocks (see the description of .IF). The condition must be
    separated from the arguments by a comma, space, or tab. If the
    first argument can be a blank, the condition must be separated
    from the arguments with a comma.

 argument(s)

    An expression or symbolic argument associated with the immediate
    conditional assembly block directive. If the argument is an
    expression, it cannot contain any undefined symbols. The
    assembler converts relocatable arguments to absolute arguments
    by discarding the relocatable portion of the expression and using
    only the offset from the beginning of the psect. The arguments
    must be separated from the statement by a comma.

 statement

    The statement to be assembled if the condition is satisfied.

31.2  –  Description

    .IIF provides a means of writing a one-line conditional assembly
    block. The condition to be tested and the conditional assembly
    block are expressed completely within the line containing the
    .IIF directive. No terminating .ENDC statement is required or
    allowed.

31.3  –  Notes

    o  The assembler displays an error message if .IIF specifies a
       condition test other than those which the assembler considers
       valid, an illegal argument, or a null argument.

31.4  –  Example

      In the following example, the symbol EXAM is defined within the
      source program:

        .IIF DEFINED EXAM, BR ALPHA

      This directive generates the following code:

        BR    ALPHA

32  –  .INCLUDE

    Include source file directive

    Format

      .INCLUDE  quoted-literal

32.1  –  Parameter

 quoted-literal

    The name of the source file to be included within double quotes.
    If a logical name exists that is the same as the source file
    name, specify the .M64 file extension to override the logical
    name.

32.2  –  Description

    .INCLUDE indicates that the current input source file should be
    suspended and that the specified file should be used. When that
    file ends, the original source stream resumes, starting at the
    line after .INCLUDE.

32.3  –  Notes

    o  The assembler issues an error message if the file nesting
       level exceeds 50.

32.4  –  Example

        .INCLUDE "file1.m64"

33  –  .INSTRUCTION

    Instruction directive

    Format

      .INSTRUCTION  expression

33.1  –  Parameter

 expression

    An absolute expression in the range of -2147483648 to 2147483647.
    The expression cannot be relocatable, external, or complex.

33.2  –  Description

    The specified value is stored at the current location as an
    instruction. You can use .INSTRUCTION to specify arbitrary
    instructions. Similar to .LONG, .INSTRUCTION stores a longword
    (32 bits) of data. Unlike .LONG, the assembler considers
    .INSTRUCTION an instruction and allows its use in code psects.

33.3  –  Notes

    o  You can only use this directive within code or mixed psects
       (psects that have either the EXE or MIX attributes).

    o  If automatic data alignment is enabled within a mixed psect,
       this directive aligns the current location counter to a
       longword (32-bit) boundary before allocating storage.

    o  You can use this directive to store arbitrary, longword,
       assembly-time constant data in a code section.

33.4  –  Example

        .INSTRUCTION 7

34  –  .IRP

    Indefinite repeat argument directive

    Format

      .IRP  symbol,<argument list>

         .

         .

         .

      range

         .

         .

         .

      .ENDR

34.1  –  Parameters

 symbol

    A formal argument that is successively replaced with the
    specified actual arguments enclosed in angle brackets (<>).  If
    no formal argument is specified, the assembler displays an error
    message.

 <argument list>

    A list of actual arguments enclosed in angle brackets and used
    in expanding the indefinite repeat range. An actual argument
    can consist of one or more characters. Multiple arguments must
    be separated by a legal separator (comma, space, or tab). If no
    actual arguments are specified, no action is taken.

 range

    The block of source text to be repeated once for each occurrence
    of an actual argument in the list. The range can contain macro
    definitions and repeat ranges. .MEXIT is legal within the range
    and causes the current and remaining repetitions to be aborted.

34.2  –  Description

    .IRP replaces a formal argument with successive actual arguments
    specified in an argument list. This replacement process occurs
    during the expansion of the indefinite repeat block range. The
    .ENDR directive specifies the end of the range.

    .IRP is similar to a macro definition with only one formal
    argument. At each successive expansion of the repeat block, this
    formal argument is replaced with successive elements from the
    argument list. The directive and its range are coded in line
    within the source program. This type of macro definition and
    its range do not require calling the macro by name, as do other
    macros described in this section.

    .IRP can appear either inside or outside another macro
    definition, indefinite repeat block, or repeat block (see the
    description of .REPEAT). The rules for specifying .IRP arguments
    are the same as those for specifying macro arguments.

34.3  –  Example

      The macro definition is as follows:

        .macro CHECK_PROCEDURE_KIND PROCEDURE_KIND
            OK = 0      ; Assume procedure_kind is unknown
            .irp REFERENCE_KIND,BOUND,NULL, REGISTER,STACK
                .if identical, <PROCEDURE_KIND>, <REFERENCE_KIND>
                    OK = 1 ; Procedure_kind is known
                    .mexit ; No need to look further
                .endc
            .endr
            .if eq, OK  ; If unknown procedure kind
                .error "Unknown procedure kind: PROCEDURE_KIND"
            .endc
        .endm CHECK_PROCEDURE_KIND

        CHECK_PROCEDURE_KIND REGISTER
        CHECK_PROCEDURE_KIND FOOZLE

      The macro call and expansion of the previously defined macro is
      as follows:

        CHECK_PROCEDURE_KIND REGISTER
            OK = 0      ; Assume procedure kind is unknown
            .if identical,<REGISTER>,<BOUND>
            .endc
            .if identical,<REGISTER>,<NULL>
            .endc
            .if identical,<REGISTER>,<REGISTER>
                OK = 1 ; Procedure kind is known
                .mexit ; No need to look further
            .if eq, OK  ; If unknown procedure kind
            .endc

        CHECK_PROCEDURE_KIND FOOZLE
            OK = 0      ; Assume procedure kind is unknown
            .if identical,<FOOZLE>,<BOUND>
            .endc
            .if identical,<FOOZLE>,<NULL>
            .endc
            .if identical,<FOOZLE>,<REGISTER>
            .endc
            .if identical,<FOOZLE>,<STACK>
            .endc
            .if eq, OK  ; If unknown procedure kind
                .error "Unknown procedure kind: FOOZLE"
            .endc

      In this example the CHECK_PROCEDURE_KIND macro uses the
      .IRP directive to iterate over a list of reference keywords
      to determine if its argument matches one of the reference
      keywords. If a match is not found, the macro displays an error
      message.

35  –  .IRPC

    Indefinite repeat character directive

    Format

      .IRPC  symbol,<STRING>

         .

         .

         .

      range

         .

         .

         .

      .ENDR

35.1  –  Parameters

 symbol

    A formal argument that is successively replaced with the
    specified characters enclosed in angle brackets (<>).  If no
    formal argument is specified, the assembler displays an error
    message.

 <STRING>

    A sequence of characters enclosed in angle brackets and used in
    the expansion of the indefinite repeat range. Although the angle
    brackets are required only when the string contains separating
    characters, their use is recommended for legibility.

 range

    The block of source text to be repeated once for each occurrence
    of a character in the list. The range can contain macro
    definitions and repeat ranges. .MEXIT is legal within the range.

35.2  –  Description

    .IRPC is similar to .IRP except that .IRPC permits single-
    character substitution rather than argument substitution. On each
    iteration of the indefinite repeat range, the formal argument is
    replaced with each successive character in the specified string.
    The .ENDR directive specifies the end of the range.

    .IRPC is similar to a macro definition with only one formal
    argument. At each expansion of the repeat block, this formal
    argument is replaced with successive characters from the actual
    argument string. The directive and its range are coded in line
    within the source program and do not require calling the macro by
    name.

    .IRPC can appear either inside or outside another macro
    definition, indefinite repeat block, or repeat block (see
    description of .REPEAT).

35.3  –  Example

      The macro definition is as follows:

            .macro X_COUNT ARG
                COUNT = 0
                .irpc CH,<ARG>
                    .iif identical,<CH>,<X>, COUNT = COUNT + 1
                .endr
            .endm X_COUNT

      The macro call and expansion of the macro defined previously is
      as follows:

            X_COUNT XXFOOXBARXX
                COUNT = 0
                .irpc CH,<XXFOOXBARXX>
                    .iif identical,<CH>,<X>, COUNT = COUNT + 1
                .endr
                    .iif identical,<X>,<X>, COUNT = COUNT + 1
                    .iif identical,<X>,<X>, COUNT = COUNT + 1
                    .iif identical,<F>,<X>, COUNT = COUNT + 1
                    .iif identical,<O>,<X>, COUNT = COUNT + 1
                    .iif identical,<O>,<X>, COUNT = COUNT + 1
                    .iif identical,<X>,<X>, COUNT = COUNT + 1
                    .iif identical,<B>,<X>, COUNT = COUNT + 1
                    .iif identical,<A>,<X>, COUNT = COUNT + 1
                    .iif identical,<R>,<X>, COUNT = COUNT + 1
                    .iif identical,<X>,<X>, COUNT = COUNT + 1
                    .iif identical,<X>,<X>, COUNT = COUNT + 1

                .print "%integer(COUNT)"
        %MACRO64-I-GENPRINT, Generated PRINT: 5

      This example uses the .IRPC directive to iterate over the
      characters in the argument to the X_COUNT macro. Each time
      an argument character is X, the variable COUNT is incremented.
      After the X_COUNT macro has expanded, the example uses the
      %INTEGER() lexical operator to display the value of COUNT.

36  –  .LIBRARY

    Macro library directive

    Format

      .LIBRARY  quoted-literal1 [quoted-literal2]

36.1  –  Parameters

 quoted-literal1

    A string enclosed within double quotes that is the file
    specification of a macro library. If a logical name exists and
    it is the same as the macro library name, specify the .MLB file
    extension to override the logical name.

 quoted-literal2

    An optional string enclosed within double quotes that specifies
    a search list of file specifications where the assembler should
    look for the specified macro library. The assembler successively
    processes the search list in left-to-right order and attempts to
    locate the specified macro library in each location specified in
    the search list until the macro library is found. If the macro
    library is not found, the assembler issues a diagnostic message.
    If you omit the second argument to the .LIBRARY directive, the
    assembler uses the following search list by default:

    o  The current device and directory

    o  The device and directory specified by the logical name
       MACRO64$LIBRARY (if defined)

    o  The device and directory specified by the logical name
       ALPHA$LIBRARY (if defined)

    o  The device and directory specified by the logical name
       SYS$LIBRARY

    Logical names may be defined as OpenVMS search lists.

36.2  –  Description

    .LIBRARY adds a name to the macro library list that is searched
    whenever a .MCALL or an undefined opcode is encountered. The
    libraries are searched in the reverse order in which they were
    specified to the assembler.

    If you omit any information from the macro-library-name file
    description, default values are assumed. The device defaults to
    your current default disk; the directory defaults to your current
    default directory; the file type defaults to MLB.

36.3  –  Example

        .LIBRARY "MY_MACROS" 1
        .LIBRARY "PROJ_MACROS" "PROJ:[MACRO],PROJ:[DEVELOPMENT]" 2

      1  The first statement adds the macro library MY_MACROS.MLB
         to the macro library list. The assembler first looks for
         MY_MACROS.MLB in the current directory. If not found there,
         the assembler next looks in the directory or directories
         indicated by the MACRO64$LIBRARY logical name if it is
         defined. If not found there or if MACRO64$LIBRARY is not
         defined, the assembler next looks in the directory or
         directories indicated by the ALPHA$LIBRARY logical name
         if it is defined. If not found there or if ALPHA$LIBRARY is
         not defined, the assembler next looks in the directory or
         directories indicated by the SYS$LIBRARY logical name. If
         not found there, the assembler issues a diagnostic message.

      2  The second statement adds the macro library PROJ_MACROS.MLB
         to the macro library list. The assembler first looks for
         PROJ_MACROS.MLB in the PROJ:[MACRO] directory. If not found
         there, the assembler next looks in the PROJ:[DEVELOPMENT]
         directory. If not found there, the assembler issues a
         diagnostic message.

37  –  .LINKAGE PAIR

    Linkage directive

    Format

      .LINKAGE_PAIR  name

37.1  –  Parameter

 name

    The name of the procedure descriptor, possibly defined in a
    different module of the routine to which linkage is required.

37.2  –  Description

    .LINKAGE_PAIR causes a linkage pair to be stored at the current
    location counter. A linkage pair consists of two quadwords. The
    first quadword is the code entry point of the routine indicated
    by the specified identifier. The second quadword is the address
    of the procedure descriptor of the routine indicated by the
    specified identifier. The second quadword is also called the
    procedure value. The specified name should reference a procedure
    descriptor that is either defined within the assembly unit or
    that becomes defined at the time the program is linked.

37.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to an octaword (128-bit) boundary
       before allocating storage.

37.4  –  Example

        .LINKAGE_PAIR A     ; Code address A followed by address of
                            ; procedure descriptor A

38  –  .LIST

    Listing directive

    Format

      .LIST  [argument-list]

38.1  –  Parameter

 argument-list

    One or more of the symbolic arguments You can use either the long
    form or the short form of the arguments. If multiple arguments
    are specified, separate them with commas, spaces, or tabs.

38.2  –  Description

    .LIST is equivalent to .SHOW. See the description of .SHOW for
    more information.

39  –  .LOCAL CODE ADDRESS

    Local code address storage directive

    Format

      .LOCAL_CODE_ADDRESS  name-list

39.1  –  Parameter

 name-list

    A list of symbols separated by commas. Each symbol references a
    procedure descriptor defined in the current module.

39.2  –  Description

    .LOCAL_CODE_ADDRESS causes the code addresses of the specified
    identifiers to be placed at the current psect and current
    location counter. The specified identifier must reference a
    procedure descriptor defined within the module. The .LOCAL_
    CODE_ADDRESS directive, rather than the .CODE_ADDRESS directive,
    must be used with procedure descriptor names that are local (as
    opposed to global) to the assembly unit.

39.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a quadword (64-bit) boundary
       before allocating storage.

39.4  –  Example

        .PROCEDURE_DESCRIPTOR P1,C1
        .BLKQ 1
        .LOCAL_CODE_ADDRESS P1       ; Code address
                                     ; of P1...address of C1...
                                     ; is stored here.

40  –  .LOCAL LINKAGE PAIR

    Local linkage directive

    Format

      .LOCAL_LINKAGE_PAIR  name

40.1  –  Parameter

 name

    The name of a procedure descriptor of the routine to which
    linkage is required. The specified procedure descriptor must
    be defined in the current module.

40.2  –  Description

    .LOCAL_LINKAGE_PAIR causes a linkage pair to be stored at
    the current location counter. A linkage pair consists of a
    code address and the address of the specified identifier. The
    specified name must reference a procedure descriptor that is
    defined within the assembly unit.

40.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to an octaword (128-bit) boundary
       before allocating storage.

40.4  –  Example

        .PROCEDURE_DESCRIPTOR P1,CA1
         .
         .
         .
        .LOCAL_LINKAGE_PAIR P1        ; Code address CA1 followed by
                                      ; procedure descriptor address P1.

41  –  .LOCAL PROCEDURE DESCRIPTOR

    Procedure descriptor labeling directive

    Format

      .LOCAL_PROCEDURE_DESCRIPTOR  pd-name, ca-name

41.1  –  Parameters

 pd-name

    The name of the procedure descriptor. This name can be up to 31
    characters long. It cannot be a temporary label.

 ca-name

    The name of the code address that corresponds to the procedure
    descriptor. This name must be defined later in the program as
    a label in a psect that has either the EXE or MIX attribute, or
    both. This name can be up to 31 characters long. It cannot be a
    temporary label.

41.2  –  Description

    .LOCAL_PROCEDURE_DESCRIPTOR defines a bivalued local identifier
    that is used to represent a local routine. The first value
    is the procedure value, which is the address of the procedure
    descriptor. This value is defined as the current location counter
    at the point where you use the .LOCAL_PROCEDURE_DESCRIPTOR
    directive. The second value is the code address, which is
    the code entry-point address of the procedure. This value is
    defined by the second argument to the .LOCAL_PROCEDURE_DESCRIPTOR
    directive. No storage is allocated.

41.3  –  Notes

    o  See the OpenVMS Calling Standard for a full description of
       procedure descriptors.

    o  You must specify .LOCAL_PROCEDURE_DESCRIPTOR before the code
       of the routine it describes.

    o  See the description for the $PROCEDURE_DESCRIPTOR and $ROUTINE
       library macros. These macros define the procedure identifier
       and define the storage for the procedure descriptor.

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a quadword (64-bit) boundary
       before defining the procedure identifier.

41.4  –  Example

        .LOCAL_PROCEDURE_DESCRIPTOR LP1,C1

42  –  .LONG

    Longword storage directive

    Format

      .LONG  expression-list

42.1  –  Parameter

 expression-list

    One or more expressions separated by commas.

42.2  –  Description

    .LONG generates successive longwords (4 bytes) of data in the
    object module. The assembler truncates on the left of an integer
    or external value.

42.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a longword (32-bit) boundary
       before allocating storage.

    o  You can define a 32-bit address item using macros and the
       .LONG directive. For example:

       .macro address_32 item
       .long item
       .endm address_32

42.4  –  Example

        .LONG 4     ; Places 4 in 4 bytes of storage.

43  –  .MACRO

    Macro definition directive

    Format

      .MACRO  macro-name [formal-argument-list]
         .

         .

         .

      range
         .

         .

         .

      .ENDM  [macro-name]

43.1  –  Parameters

 macro-name

    The name of the macro to be defined; this name can be any legal
    symbol up to 31 characters long.

 formal-argument-list

    The symbols, separated by commas, to be replaced by the actual
    arguments in the macro call.

 range

    The source text to be included in the macro expansion.

43.2  –  Description

    .MACRO begins the definition of a macro. It gives the macro name
    and a list of formal arguments. The .MACRO directive is followed
    by the source text to be included in the macro expansion. The
    .ENDM directive specifies the end of the range.

    Macro names do not conflict with user-defined symbols. Both a
    macro and a user-defined symbol can have the same name.

    When the assembler encounters a .MACRO directive, it adds the
    macro name to its macro name table and stores the source text
    of the macro (up to the matching .ENDM directive). No other
    processing occurs until the macro is expanded.

    The symbols in the formal argument list are associated with the
    macro name and are limited to the scope of the definition of that
    macro. For this reason, the symbols that appear in the formal
    argument list can also appear elsewhere in the program.

43.3  –  Notes

    o  If a macro has the same name as an Alpha opcode, the macro
       is used instead of the instruction. This feature allows you to
       temporarily redefine an opcode.

    o  You can redefine a macro by using a .MACRO directive with the
       same name as in a previous macro definition. Therefore, the
       previous macro definition is implicitly deleted and the new
       macro definition supersedes the previous definition. See the
       .MDELETE directive for more information on macro deletion.

    o  You can nest a macro definition within another macro
       definition. The inner macro is not defined until the outer
       macro is invoked.

    o  You can nest a macro invocation so that one macro can invoke
       another. The assembler supports nested macro invocations to a
       depth of 1000. If a macro invokes itself, either directly or
       indirectly, it is recursive. Recursive macros must specify a
       basis-step in order to avoid infinite recursion. A basis-step
       is a macro exit condition that will eventually cause the macro
       to exit, which ends the recursion (see Example 3).

43.4  –  Examples

      Example 1
      This example shows how macro definitions and invocations may
      be nested. It also shows examples of the various forms of
      parameter passing.

        .MACRO OP1 A,B=R4,?C
        C:      ADDL R2, B, R3
        .MACRO OP'B
                TRAPB
        .ENDM OP'B
                ADDL A, R2, R3
                OP'B
                .MDELETE OP'B
        .ENDM OP1

      When OP1 is invoked "OP1 R0", the text expands to:

        33000$: ADDL R2, R4, R3
        .MACRO OPR4
                TRAPB
        .ENDM
                ADDL R0, R2, R3
                OPR4
                .MDELETE OPR4

      Processing this text will cause OPR4 to be expanded to TRAPB;
      the final text will be:

        33000$: ADDL R2, R4 R3
                ADDL R0, R2, R3
                TRAPB

      Example 2
      The following example shows macro redefinition:

        .MACRO INITIALIZE
           .MACRO INITIALIZE   ;Redefine to nothing
           .ENDM INITIALIZE
           X=0
           Y=1
           Z=-1
        .ENDM INITIALIZE

      Note that while the redefined version of the macro immediately
      supersedes the previous definition in any subsequent
      invocation, the invocation of the original definition expands
      to completion.
      Example 3
      This example shows a recursive macro:

        .MACRO FACTORIAL N
           .IF EQUAL <N>,0      ;Basis step; stop at zero
              F=1
           .ELSE
              FACTORIAL <N-1>
              F = F * <N>
           .ENDC
        .ENDM FACTORIAL

44  –  .MCALL

    Macro call directive

    Format

      .MCALL  macro-name-list

44.1  –  Parameter

 macro-name-list

    A list of macros to be defined for this assembly. Separate the
    macro names with commas.

44.2  –  Description

    .MCALL specifies the names of the system and user-defined macros
    that are required to assemble the source program but are not
    defined in the source file.

    If any named macro is not found upon completion of the search
    (that is, if the macro is not defined in any of the macro
    libraries), the assembler displays an error message.

44.3  –  Notes

    o  Using the .MCALL directive is optional unless the macro name
       is the same as an opcode or assembler directive. The assembler
       automatically searches for a library macro when it encounters
       an identifier that is not an opcode or directive in the
       opcode field. If your macro name is the same as an opcode or
       directive, you must use the .MCALL directive. You can also use
       the .MCALL directive in your program to document which macros
       are used by your program.

44.4  –  Example

        .MCALL TRAPB       ; Substitute macro in library for
                           ; TRAPB instruction

45  –  .MDELETE

    Macro deletion directive

    Format

      .MDELETE  macro-name-list

45.1  –  Parameter

 macro-name-list

    A list of macros whose definitions are to be deleted. You can
    separate the macros with commas or spaces.

45.2  –  Description

    .MDELETE deletes the definitions of specified macros.

    .MDELETE completely deletes the macro. If you delete a macro that
    is currently expanding (such as a macro that deletes itself),
    the macro name is immediately removed from the macro name table
    and the macro is marked for deletion. When the macro finishes
    expanding, it is deleted.

45.3  –  Example

        .MACRO FOO
        .PRINT "In macro FOO"
        .ENDM FOO
        FOO
        .MDELETE FOO

46  –  .MEXIT

    Macro exit directive

    Format

      .MEXIT

46.1  –  Description

    .MEXIT terminates a macro expansion before the end of the macro.
    Termination is the same as if .ENDM were encountered. You can
    also use the directive within repeat blocks. .MEXIT is useful
    in conditional expansion of macros and repeat blocks because it
    bypasses the complexities of nested conditional directives and
    alternate assembly paths.

46.2  –  Notes

    o  When .MEXIT occurs in a repeat block, the assembler terminates
       the current repetition of the range and suppresses further
       expansion of the repeat range.

    o  When macros or repeat blocks are nested, .MEXIT exits to the
       next higher level of expansion.

    o  If .MEXIT occurs outside a macro definition or a repeat block,
       the assembler displays an error message.

46.3  –  Examples

      Example 1
      The following macro definition uses the .MEXIT directive
      to exit the current macro when it has finished processing a
      particular kind of argument:

                .macro STORE REG, LOCATION
                    .if identical,<REG>,<FP>
                        STQ REG, LOCATION
                        .mexit
                    .endc
                    .if identical,<REG>,<SP>
                        STQ REG, LOCATION
                        .mexit
                    .endc
                    .if identical,<%extract(0,1,<REG>)>,<R>
                        STQ REG, LOCATION
                        .mexit
                    .endc
                    .if identical,<%extract(0,1,<REG>)>,<F>
                        STT REG, LOCATION
                        .mexit
                    .endc
                    .error "Register argument is not a register"
                .endm STORE

      Example 2
      In this example, the STORE macro (as defined in Example 1)
      attempts to recognize its REG argument as either FP, SP, an
      integer register (a register with R as its first letter),
      or a floating-point register (a register with F as its first
      letter). The following example show two expansions of the STORE
      macro:

                STORE R1, 0(SP)
                    .if identical,<R1>,<FP>
                    .endc
                    .if identical,<R1>,<SP>
                    .endc
                    .if identical,<%extract(0,1,<R1>)>, <R>
                    .if identical,<R>,<R>
                        STQ R1, 0(SP)
                        .mexit

                STORE 24(SP), 16(SP)
                    .if identical,<24(SP)>,<FP>
                    .endc
                    .if identical,<24(SP)>,<SP>
                    .endc
                    .if identical,<%extract(0,1,<24(SP)>)>,<R>
                    .if identical,<2>,<R>
                    .endc
                    .if identical, <%extract(0,1<24(SP)>)>,<F>
                    .if identical,<2>,<F>
                    .endc
                    .error "Register argument is not a register"

      The first call of the STORE macro stores R1 at 0(SP). The
      STORE macro determines to do an integer store by recognizing
      the letter R as the first letter of the register name. After
      it has done so, it abandons further expansion of the macro
      using the .MEXIT directive. The second invocation attempts to
      store 24(SP) at 16(SP). Since the STORE macro cannot identify
      24(SP) as a legitimate register in any of the four forms it
      recognizes, the STORE macro does not attempt to store the
      REG argument, and does not abandon expansion with the .MEXIT
      directive. Instead, the STORE macro expands and issues a
      diagnostic message.

47  –  .NARG

    Number of arguments directive

    Format

      .NARG  symbol

47.1  –  Parameter

 symbol

    A symbol that is assigned a value equal to the number of
    positional arguments in the macro call.

47.2  –  Description

    .NARG determines the number of arguments in the current macro
    call.

    .NARG counts all the positional arguments specified in the macro
    call, including null arguments (specified by adjacent commas).
    The value assigned to the specified symbol does not include
    any keyword arguments or any formal arguments that have default
    values.

47.3  –  Notes

    o  If .NARG appears outside a macro, the assembler displays an
       error message.

47.4  –  Examples

      Example 1
      The macro definition is as follows:

        .MACRO  CNT_ARG A1,A2,A3,A4,A5,A6,A7,A8,A9=DEF9,A10=DEF10
        .NARG   COUNTER         ; COUNTER is set to no. of ARGS
        .WORD   COUNTER         ; Store value of COUNTER
        .ENDM   CNT_ARG
      Example 2
      The macro calls and expansions of the macro previously defined
      are as follows:

        CNT_ARG TEST,FIND,ANS   ; COUNTER will = 3
        .NARG   COUNTER         ; COUNTER is set to no. of ARGS
        .WORD   COUNTER         ; Store value of COUNTER

        CNT_ARG                 ; COUNTER will = 0
        .NARG   COUNTER         ; COUNTER is set to no. of ARGS
        .WORD   COUNTER         ; Store value of COUNTER

        CNT_ARG TEST,A2=SYMB2,A3=SY3      ; COUNTER will = 1
        .NARG   COUNTER         ; COUNTER is set to no. of ARGS
        .WORD   COUNTER         ; Store value of COUNTER
                                ; Keyword arguments are not counted

        CNT_ARG ,SYMBL,,        ; COUNTER will = 4
        .NARG   COUNTER         ; COUNTER is set to no. of ARGS
        .WORD   COUNTER         ; Store value of COUNTER
                                ; Null arguments are counted

48  –  .NCHR

    Number of characters directive

    Format

      .NCHR  symbol,<string>

48.1  –  Parameters

 symbol

    A symbol that is assigned a value equal to the number of
    characters in the specified character string.

 <string>

    A sequence of printable characters. Delimit the character
    string with angle brackets (<>)  (or a character preceded by a
    circumflex (^))  only if the specified character string contains
    a legal separator (comma, space, or tab) or a
    semicolon (;).

48.2  –  Description

    .NCHR determines the number of characters in a specified
    character string. It can appear anywhere in an MACRO-64 program
    and is useful in calculating the length of macro arguments.

48.3  –  Notes

    o  You can use the %LENGTH lexical operator instead of the .NCHR
       directive.

48.4  –  Examples

      Example 1
      The macro definition is as follows:

        .MACRO   CHAR    MESS                  ; Define MACRO
        .NCHR    CHRCNT,<MESS>      ; Assign value to CHRCNT
        .WORD    CHRCNT                        ; Store value
        .ASCII   "MESS"                        ; Store characters
        .ENDM    CHAR                          ; Finish
      Example 2
      The macro calls and expansions of the macro previously defined
      are as follows:

        CHAR     <HELLO>                        ; CHRCNT will = 5
        .NCHR    CHRCNT,<HELLO>                 ; Assign value to CHRCNT
        .WORD    CHRCNT                          ; Store value
        .ASCII   "HELLO"                         ; Store characters

        CHAR     <14, 75.39  4>                 ; CHRCNT will = 12(dec)
        .NCHR    CHRCNT,<14, 75.39  4>          ; Assign value to CHRCNT
        .WORD    CHRCNT                          ; Store value
        .ASCII   "14, 75.39  4"                  ; Store characters

49  –  .NLIST

    Listing exclusion directive

    Format

      .NLIST  [argument-list]

49.1  –  Parameter

 argument-list

    One or more of the symbolic arguments Use either the long form
    or the short form of the arguments. If you specify multiple
    arguments, separate them with commas, spaces, or tabs.

49.2  –  Description

    .NLIST is equivalent to .NOSHOW. See the description of .SHOW for
    more information.

50  –  .NOSHOW

    Listing exclusion directive

    Format

      .NOSHOW  [argument-list]

50.1  –  Parameter

 argument-list

    One or more of the symbolic arguments listed in the description
    of .SHOW. Use either the long form or the short form of the
    arguments. If you specify multiple arguments, separate them with
    commas, spaces, or tabs.

50.2  –  Description

    .NOSHOW specifies listing control options. See the description of
    .SHOW for more information.

51  –  .OCTA

    Octaword storage directive

    Format

      .OCTA  expression-list

51.1  –  Parameter

 expression-list

    A list of constant values separated by commas. Each value results
    in a 64-bit value being sign-extended to 128 bits and stored in
    an octaword.

51.2  –  Description

    .OCTA generates 128 bits (16 bytes) of binary data.

51.3  –  Notes

    o  The low quadword contains the specified constant value.

    o  The high quadword contains the sign extension of the specified
       constant value. That is, the high quadword contains 0 if the
       specified value is positive, and it contains all bits set to 1
       if the specified value is negative.

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to an octaword (128-bit) boundary
       before allocating storage.

51.4  –  Example

        .OCTA  0                         ; OCTA 0
        .OCTA  ^X01234ABCD5678F9         ; OCTA hex value specified

        .OCTA  VINTERVAL                 ; VINTERVAL has 64-
 bit value,

                                         ;   sign-extended

52  –  .ODD

    Odd location counter alignment directive

    Format

      .ODD

52.1  –  Description

    .ODD ensures that the current value of the location counter is
    odd by adding 1 if the current value is even. If the current
    value is already odd, no action is taken.

52.2  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

53  –  .PACKED

    Packed decimal string storage directive

    Format

      .PACKED  decimal-string[,symbol]

53.1  –  Description

    .PACKED is supplied as a library macro with MACRO-64.

54  –  .PAGE

    Page ejection directive

    Format

      .PAGE

54.1  –  Description

    .PAGE forces a new page in the listing. The directive itself is
    also printed in the listing and begins the new page.

    .PAGE in a macro definition is ignored. The paging operation is
    performed only during macro expansion. If the .PAGE directive
    occurs during macro expansion, text beginning with the original
    macro invocation line appears at the top of a new page.

54.2  –  Example

        .MACRO SKIP    ; macro definition with .PAGE
        .PAGE          ;
        .ENDM SKIP     ;
        .PSECT A,NOEXE ;
        .BLKW 10       ;
        SKIP           ; In the listing file, a form feed
                       ;  will be inserted here

55  –  .PRINT

    Assembly message directive

    Format

      .PRINT  quoted-literal

55.1  –  Parameter

 quoted-literal

    The string of characters enclosed in quotes are displayed when
    encountered during assembly.

55.2  –  Description

    .PRINT causes the assembler to display an informational message.
    The message consists of the string.

55.3  –  Notes

    o  .PRINT, .WARN, and .ERROR are directives that display
       messages. You can use these to display information indicating
       unexpected or important conditions within the assembly.

    o  This directive also accepts VAX MACRO syntax. See the
       VAX MACRO and Instruction Set Reference Manual for details.

55.4  –  Example

        .PRINT "Questionable usage"
        ^
        %MACRO64-I-GENPRINT, Generated PRINT: Questionable usage
        at line number 3 in file DISK$:[TEST]PRINT.M64;2

56  –  .PROCEDURE DESCRIPTOR

    Procedure descriptor labeling directive

    Format

      .PROCEDURE_DESCRIPTOR  pd-name, ca-name

56.1  –  Parameters

 pd-name

    The name of the procedure descriptor. This name can be up to 31
    characters long. It cannot be a temporary label.

 ca-name

    The name of the code address that corresponds to the procedure
    descriptor. This name must be defined later in the program as
    a label in a psect that has either the EXE or MIX attribute, or
    both. This name can be up to 31 characters long. It cannot be a
    temporary label.

56.2  –  Description

    .PROCEDURE_DESCRIPTOR defines a bivalued global identifier
    that is used to represent a global routine. The first value
    is the procedure value, which is the address of the procedure
    descriptor. This value is defined as the current location counter
    at the point where you use the .PROCEDURE_DESCRIPTOR directive.
    The second value is the code address, which is the code entry-
    point address of the procedure. This value is defined by the
    second argument to the .PROCEDURE_DESCRIPTOR directive. No
    storage is allocated.

56.3  –  Notes

    o  See the OpenVMS Calling Standard for a full description of
       procedure descriptors.

    o  You must specify .PROCEDURE_DESCRIPTOR before the code of the
       routine it describes.

    o  See the descriptions for the $PROCEDURE_DESCRIPTOR and
       $ROUTINE library macros. These macros define the procedure
       identifier and define the storage for the procedure
       descriptor.

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a quadword (64-bit) boundary
       before defining the procedure identifier.

57  –  .PSECT

    Program sectioning directive

    Format

      .PSECT  program-section-name[,argument-list]

57.1  –  Parameters

 program-section-name

    The name of the program section (psect).

 argument-list

    A list containing the program section attributes and the program
    section alignment. Program sections are aligned when you specify
    an integer in the range of 0 to 16 or one of the five keywords
    listed in the following table. If you specify an integer, the
    program section is linked to begin at the next virtual address
    that is a multiple of two raised to the power of the integer. If
    you specify a keyword, the program section is linked to begin at
    the next virtual address that is a multiple of the corresponding
    value listed in the following table:

    KeywordSize (in Bytes)

    BYTE   20 = 1
    WORD   21 = 2
    LONG   22 = 4
    QUAD   23 = 8
    OCTA   24 = 16

    QUAD is the default.

    Table 8 Program Section Attributes

    AttribuFunction

    ABS    Absolute-The program section has an absolute address. An
           absolute program section contributes no binary code to
           the image, so its byte allocation request to the linker
           is 0. You cannot store initial values in an absolute
           program section with directives such as .BYTE, .WORD,
           .LONG, .QUAD. Usually the .BLKx directives are used in
           conjunction with label definitions within an absolute
           program section to define symbolic offsets within a
           structure. Compare this attribute with its opposite, REL.

    CON    Concatenate-Program sections with the same name and
           attributes (including CON) from other modules are
           concatenated into one program section at link time. Their
           contents are concatenated in the order in which the linker
           acquires them. The allocated virtual address space is the
           sum of the individual requested allocations. Compare this
           attribute with its opposite, OVL.

    EXE    Executable-The program section contains instructions.
           This attribute provides the capability of separating
           instructions from read-only and read/write data. The
           linker uses this attribute in gathering program sections
           and in verifying that the transfer address is in an
           executable program section. The assembler only allows
           you to place instructions in a program section that has
           either or both the EXE or MIX attributes. Compare this
           attribute with its opposite, NOEXE.

    GBL    Global-Program sections that have the same name and
           attributes will be combined at link time into a single
           program section even when the individual program sections
           are in different clusters. This attribute is specified
           for Fortran COMMON block program sections. Compare this
           attribute with its opposite, LCL.

    LCL    Local-The program section is restricted to its cluster.
           Compare this attribute with its opposite, GBL.

    MIX    Mix-The program section can contain both data and
           instructions. The MIX and NOMIX attributes are assembly-
           time attributes that only affect assembler processing.
           The MIX and NOMIX attributes do not appear in the object
           module and do not affect linker processing. To mix
           instructions and data in the same psect, you must specify
           the MIX attribute. The NOMIX attribute is the default. If
           you choose to use instructions in a NOEXE psect, or use
           data directives in an EXE psect, you must specify the MIX
           attribute. The following limitations apply when using the
           MIX attribute:

           o  Optimizations and alignment of code labels are not
              performed. Optimizations and code-label alignment are
              not performed on instructions placed in a MIX psect,
              regardless of whether the .ENABLE/.DISABLE options have
              been set, or if the command-line /OPTIMIZATION and
              /ALIGNMENT=CODE options have been specified.

           o  Limited debugging information is provided. No PC-line
              (program counter) correlation information is generated
              for the instructions placed in a MIX psect.

           o  The listing file includes only binary encoded
              instructions. All instructions that are placed in a
              MIX psect appear in the machine-code portion of the
              listing file, in their binary encoded instruction form
              as a data initializer to the .LONG data directive.

           There are no restrictions on data directives. Compare this
           attribute with its opposite, NOMIX.

    NOEXE  Not Executable-The program section contains data only; it
           does not contain instructions. The assembler only allows
           you to place data allocations in a program section that
           has either or both the NOEXE and MIX attributes. Compare
           this attribute with its opposite, EXE.

    NOMIX  The default attribute when you use the .PSECT directive.
           Compare this attribute with its opposite, MIX.

    NOPIC  Non-Position-Independent Content-The program section is
           assigned to a fixed location in virtual memory (when it
           is in a shareable image). Compare this attribute with its
           opposite, PIC.

    NORD   Nonreadable-Reserved for future use. Compare this
           attribute with its opposite, RD.

    NOSHR  No Share-The program section is reserved for private use
           at execution time by the initiating process. Compare this
           attribute with its opposite, SHR.

    NOWRT  Nonwritable-The contents of the program section cannot
           be altered (written into) at execution time. Compare this
           attribute with its opposite, WRT.

    OVR    Overlay-Program sections with the same name and attributes
           (including OVR) from other modules receive the same
           relocatable base address in memory at link time. The
           allocated virtual address space is the requested
           allocation of the largest overlaying program section.
           Compare this attribute with its opposite, CON.

    PIC    Position-Independent Content-The program section can be
           relocated; that is, it can be assigned to any memory area
           (when it is in a shareable image). Compare this attribute
           with its opposite, NOPIC.

    RD     Readable-Reserved for future use. Compare this attribute
           with its opposite, NORD.

    REL    Relocatable-The linker assigns the program section a
           relocatable base address. The contents of the program
           section can be code or data. Compare this attribute with
           its opposite, ABS.

    SHR    Share-The program section can be shared at execution time
           by multiple processes. This attribute is assigned to a
           program section that can be linked into a shareable image.
           Compare this attribute with its opposite, NOSHR.

    WRT    Write-The contents of the program section can be altered
           (written into) at execution time. Compare this attribute
           with its opposite, NOWRT.

    Table 9 Default Program Section Attributes

    Default
    Attribute   Opposite Attribute

    CON         OVR
    EXE         NOEXE
    LCL         GBL
    NOMIX       MIX
    NOPIC       PIC
    NOSHR       SHR
    RD          NORD
    REL         ABS
    WRT         NOWRT

57.2  –  Description

    .PSECT defines a program section and its attributes and refers to
    a program section after it is defined. Use program sections to do
    the following:

    o  Develop modular programs.

    o  Separate instructions from data.

    o  Allow different modules to access the same data.

    o  Protect read-only data and instructions from being modified.

    o  Identify sections of the object module to the linker and the
       debugger.

    o  Control the order in which program sections are stored in
       virtual memory.

    When the assembler encounters a .PSECT directive that specifies
    a new program section name, it creates a new program section
    and stores the name, attributes, and alignment of the program
    section. The assembler includes all data or instructions that
    follow the .PSECT directive in that program section until it
    encounters another .PSECT directive. The assembler starts all
    program sections at a relative location counter of 0.

    The assembler does not automatically define program sections.
    Any code or data placed before the first .PSECT directive in the
    source code produces an assembly error.

    If the assembler encounters a .PSECT directive that specifies
    the name of a previously defined program section, it stores the
    new data or instructions after the last entry in the previously
    defined program section, even with program sections that have
    the OVR attribute. (OVR program sections from separate modules
    are overlaid by the linker. The OVR attribute does not affect
    how multiple contributions to a psect are processed within a
    single assembly unit.) You need not relist the attributes when
    continuing a program section, but any attributes that are listed
    must be the same as those previously in effect for the program
    section. A continuation of a program section cannot contain
    attributes conflicting with those specified, or defaulted, in
    the original .PSECT directive.

    The attributes listed in the .PSECT directive describe the
    contents of the program section. Except for the EXE and NOEXE
    attributes, the assembler does not check to ensure that the
    contents of the program section actually adhere to the attributes
    listed. However, the assembler and the linker do check that
    all program sections with the same name have exactly the same
    attributes. The assembler and linker display an error message if
    the program section attributes are not consistent.

    Program section names are independent of local symbol, global
    symbol, and macro names. You can use the same symbolic name
    for a program section and for a local symbol, global symbol,
    or macro name. You may want to use unique names for clarity and
    maintainability.

57.3  –  Notes

    o  The .ALIGN directive cannot specify an alignment greater than
       that of the current program section; consequently, .PSECT
       should specify the largest alignment needed in the program
       section.

    o  For efficiency of execution and ease of programming, an
       alignment of quadword or larger is recommended for all program
       sections that have quadword data.

57.4  –  Example

        .PSECT A,QUAD,EXE     ; Code psect

58  –  .QUAD

    Quadword storage directive

    Format

      .QUAD  expression-list

58.1  –  Parameter

 expression-list

    One or more expressions separated by commas.

58.2  –  Description

    .QUAD generates 64 bits (8 bytes) of binary data.

58.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a quadword (64-bit) boundary
       before allocating storage.

58.4  –  Example

        A:: .QUAD 4

59  –  .REPEAT

    Repeat block directive

    Format

      .REPEAT expression
         .

         .

         .

      range
         .

         .

         .

      .ENDR

59.1  –  Parameters

 expression

    An expression whose value controls the number of times the range
    is to be assembled within the program. When the expression is
    less than or equal to 0, the repeat block is not assembled. The
    expression must be absolute or relocatable and must not contain
    any undefined symbols. The assembler converts a relocatable value
    to the relative offset within the psect.

 range

    The source text to be repeated the number of times specified by
    the value of the expression. The repeat block can contain macro
    definitions or other repeat blocks. .MEXIT is legal within the
    range and causes the current and all succeeding repetitions to be
    aborted.

59.2  –  Description

    .REPEAT repeats a block of code a specified number of times in
    line with other source code. The .ENDR directive specifies the
    end of the range.

59.3  –  Notes

    The alternate form of .REPEAT is .REPT.

59.4  –  Examples

      Example 1
      The following macro definition uses the .REPEAT directive to
      store an ASCII string a specified number of times, followed by
      a 0 byte:

        .MACRO  COPIES  STRING,NUM
        .REPEAT NUM
        .ASCII  "STRING"
        .ENDR
        .BYTE   0
        .ENDM   COPIES
      Example 2
      The following macro call stores five copies of the string
      ABCDEF. This example is divided into four parts:

      Macro invocation:

        COPIES  <ABCDEF>,5

      Macro expansion of .REPEAT invocation:

          .REPEAT 5
          .ASCII  "ABCDEF"
          .ENDR

      .REPEAT expansion:

          .ASCII  "ABCDEF"
          .ASCII  "ABCDEF"
          .ASCII  "ABCDEF"
          .ASCII  "ABCDEF"
          .ASCII  "ABCDEF"

      End of macro expansion:

          .BYTE   0
      Example 3
      The following macro call stores three copies of the string How
      Many Times. This example is divided into four parts:

      Macro invocation:

          VARB = 3
          COPIES  <How Many Times>,VARB

      Macro expansion of .REPEAT invocation:

          .REPEAT VARB
          .ASCII  "How Many Times"
          .ENDR

      .REPEAT expansion:

          .ASCII  "How Many Times"
          .ASCII  "How Many Times"
          .ASCII  "How Many Times"

      End of macro expansion:

          .BYTE   0

60  –  .RESTORE PSECT

    Restore previous program section context directive

    Format

      .RESTORE_PSECT

      .RESTORE

60.1  –  Description

    .RESTORE_PSECT retrieves the program section from the top of
    the program section context stack, an internal stack in the
    assembler. If the stack is empty when .RESTORE_PSECT is issued,
    the assembler displays an error message. When .RESTORE_PSECT
    retrieves a program section, it restores the current location
    counter to the value it had when the program section was saved.
    The maximum stack level is 50. See the description of .SAVE_PSECT
    for more information.

60.2  –  Notes

    o  The alternate form of .RESTORE_PSECT is .RESTORE.

    o  You cannot use .RESTORE_PSECT to overwrite previous data-
       storage initializations. In the following example, MACRO-
       64 attempts to store 42 over 43 and fails, resulting in a
       diagnostic:

       .PSECT A
       .SAVE PSECT
       .PSECT A
       .QUAD 43
       .RESTORE PSECT
       .QUAD 42

60.3  –  Example

            .PSECT A,QUAD,NOEXE
        A1: .WORD 5
        A2: .QUAD 6
            .SAVE_PSECT        ; Saves psect A context
            .PSECT B,QUAD,NOEXE
        B1: .WORD 6
            .RESTORE_PSECT     ; Return A location counter
        A3: .WORD 5

            .PSECT B,QUAD,NOEXE
        1$: .WORD 5
            .SAVE LOCAL_BLOCK  ; Saves psect B context and temporary
                               ; label context

            .PSECT C,NOEXE
        1$: .WORD 6
            .RESTORE_PSECT     ; Restores psect B and saves
                               ; label context
            .ADDRESS 1$        ; References the address of
                               ; psect B temporary label 1$

61  –  .SAVE PSECT

    Save current program section context directive

    Format

      .SAVE_PSECT  [LOCAL_BLOCK]

      .SAVE  [LOCAL_BLOCK]

61.1  –  Description

    .SAVE_PSECT stores the current program section context on the
    top of the program section context stack, an internal assembler
    stack. It leaves the current program section context in effect.
    The program section context stack can hold up to 50 entries.
    Each entry includes the value of the current location counter
    and the maximum value assigned to the location counter in the
    current program section. If the stack is full when .SAVE_PSECT is
    encountered, an error occurs.

    If the LOCAL_BLOCK option is specified, the current temporary
    label block is saved with the current program section context.

    .SAVE_PSECT and .RESTORE_PSECT are especially useful in macros
    that define program sections. See the description of .RESTORE_
    PSECT for an example using .SAVE_PSECT.

61.2  –  Notes

    o  The alternate form of .SAVE_PSECT is .SAVE.

62  –  .S FLOATING

    Single-precision IEEE floating-point arithmetic directive

    Format

      .S_FLOATING  floating-point-number-list

62.1  –  Parameter

 floating-point-number-list

    A list of IEEE single-precision floating-point constants
    separated by commas.

62.2  –  Description

    .S_FLOATING evaluates the specified floating-point constants and
    stores the results in the object module. .S_FLOATING generates
    32-bit, single-precision, floating-point data (1 bit of sign, 8
    bits of exponent, and 23 bits of fractional significance). See
    the description of .T_FLOATING for information on storing double-
    precision floating-point IEEE numbers and the descriptions of
    .D_FLOATING, .F_FLOATING, and .G_FLOATING for descriptions of
    other floating-point numbers.

62.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a longword (32-bit) boundary
       before allocating storage.

62.4  –  Example

        .S_FLOATING 2.0,3.0,4.405

63  –  .SHOW

    Listing inclusion and exclusion directives

    Format

      .SHOW  [argument-list]

      .NOSHOW  [argument-list]

63.1  –  Parameter

 [argument-list]

    You can use either the long form or the short form of the
    arguments. If you specify multiple arguments, you must separate
    them by commas. If any argument is not specifically included in
    a listing control statement, the assembler assumes its default
    value (show or noshow) throughout the source program.

    Table 10 .SHOW and .NOSHOW Symbolic Arguments

                  Short
    Long Form     Form     Default  Function

    BINARY        MEB      Noshow   Lists macro and repeat block
                                    expansions that generate binary
                                    code. BINARY is a subset of
                                    EXPANSIONS.
    CONDITIONALS  CND      Noshow   Lists unsatisfied conditional
                                    code associated with the
                                    conditional assembly directives.
    EXPANSIONS    ME       Noshow   Lists macro and repeat range
                                    expansions.
    LIBRARY       None     Noshow   Includes the macro definitions in
                                    a library in the listing.
    INCLUDE       None     Noshow   Lists include file text in the
                                    listing file.

63.2  –  Description

    .SHOW and .NOSHOW specify listing control options in the source
    text of a program. You can use .SHOW and .NOSHOW with or without
    an argument list.

    .SHOW and .NOSHOW control the listing of the source lines that
    are in conditional assembly blocks (see the description of .IF),
    macros, and repeat blocks. When you use them without arguments,
    these directives alter the listing level count. The listing level
    count is initialized to 0. Each time .SHOW appears in a program,
    the listing level count is incremented; Each time .NOSHOW appears
    in a program, the listing level count is decremented.

    When the listing level count is negative, the listing is
    suppressed unless the line contains an error. Conversely, when
    the listing level count is positive, the listing is generated.
    When the count is 0, the line is either listed or suppressed,
    depending on the value of the listing control symbolic arguments.

63.3  –  Notes

    o  The listing level count allows macros to be listed
       selectively; a macro definition can specify .NOSHOW at the
       beginning to decrement the listing count and can specify .SHOW
       at the end to restore the listing count to its original value.

    o  The alternate forms of .SHOW and .NOSHOW are .LIST and .NLIST.

    o  The initial setting for each .LIST/.SHOW option (except
       BINARY) is obtained from the command-line setting using the
       /SHOW qualifier.

    o  The /[NO]SHOW=BINARY option overrides the .[NO]SHOW BINARY
       directive.

63.4  –  Example

        .NOSHOW   ; Turn off listing file display.  Counter < 0.
           .
           .
           .
        .SHOW     ; Turn on listing file display.  Counter = 0.
                  ; Value of .SHOW options are used.
           .
           .
           .
        .SHOW     ; Counter > 0.  Listing file display is
                  ; on for all options regardless of setting.
           .
           .
           .

64  –  .SIGNED BYTE

    Signed byte storage directive

    Format

      .SIGNED_BYTE  expression-list

64.1  –  Parameters

 expression-list

    An expression or list of expressions separated by commas. Each
    expression specifies a value to be stored. The value must be in
    the range of -128 through +127.

64.2  –  Description

    .SIGNED_BYTE generates successive bytes of binary data in the
    object module and performs signed range checking. Apart from
    the range check, .SIGNED_BYTE is equivalent to .BYTE for storage
    allocation.

64.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

64.4  –  Example

        .PSECTA,NOEXE
        .SIGNED_BYTE   LABEL1-LABEL2  ;  Data must fit
        .SIGNED_BYTE   -126           ;     in a byte

65  –  .SIGNED WORD

    Signed word storage directive

    Format

      .SIGNED_WORD  expression-list

65.1  –  Parameter

 expression-list

    An expression or list of expressions separated by commas. Each
    expression specifies a value to be stored. The value must be in
    the range of -32,768 through +32,767.

65.2  –  Description

    .SIGNED_WORD generates successive words of binary data in the
    object module and performs signed range checking. Apart from
    the range check, .SIGNED_WORD is equivalent to .WORD in terms of
    storage allocation.

65.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a word (16-bit) boundary
       before allocating storage.

65.4  –  Example

        .PSECT $DATA,NOEXE
        .SIGNED_WORD -32766;
        .SIGNED_WORD 32769 ;causes assembly error

66  –  .SUBTITLE

    Listing subtitle directive

    Format

      .SUBTITLE  quoted-literal

      .SBTTL  quoted-literal

66.1  –  Parameter

 quoted-literal

    An ASCII string enclosed in quotes from 1 to 31 characters long;
    excess characters are truncated.

66.2  –  Description

    .SUBTITLE causes the assembler to print the line of text as
    the subtitle on the second line of each assembly listing page.
    This subtitle text is printed on each page until altered by a
    subsequent .SUBTITLE directive in the program.

66.3  –  Notes

    o  The alternate form of .SUBTITLE is .SBTTL.

    o  This directive also accepts VAX MACRO syntax. See the
       VAX MACRO and Instruction Set Reference Manual for details.

66.4  –  Example

        .SUBTITLE "Terminal Display Routines"

67  –  .T FLOATING

    Double-precision IEEE floating-point arithmetic directive

    Format

      .T_FLOATING  floating-point-number-list

67.1  –  Parameter

 floating-point-number-list

    A list of IEEE double-precision floating-point constants
    separated by commas.

67.2  –  Description

    .T_FLOATING evaluates the specified floating-point constants and
    stores the results in the object module. .T_FLOATING generates
    64-bit, double-precision, floating-point data (1 bit of sign, 11
    bits of exponent, and 52 bits of fractional significance). See
    the description of .S_FLOATING for information on storing single-
    precision floating-point IEEE numbers and the descriptions of .D_
    FLOATING, .F_FLOATING, and .G_FLOATING for descriptions of other
    floating-point numbers.

67.3  –  Notes

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a quadword (64-bit) boundary
       before allocating storage.

67.4  –  Example

        .T_FLOATING 4.5036,6.034

68  –  .TITLE

    Listing title directive

    Format

      .TITLE  module-name ["listing-title"]

68.1  –  Parameters

 module-name

    Either a quoted literal or an identifier that specifies the
    module's title.

 "listing-title"

    Optional quoted literal that specifies a title to appear within
    the first line of each listing output file.

68.2  –  Description

    .TITLE assigns a name to the object module.

68.3  –  Notes

    o  The module name specified with .TITLE bears no relationship
       to the file specification of the object module, as specified
       in the MACRO-64 command line. The object module name appears
       in the linker load map and is also the module name that the
       debugger and librarian recognize.

    o  If .TITLE is not specified, MACRO-64 assigns the default
       name (.MAIN.) to the object module. If more than one .TITLE
       directive is specified in the source program, the last .TITLE
       directive encountered establishes the name for the entire
       object module.

    o  This directive also accepts VAX MACRO syntax. See the
       VAX MACRO and Instruction Set Reference Manual for details.

68.4  –  Example

        .TITLE "MAIN" "Main Entry Point"

69  –  .UNDEFINE REG

    Undefine register symbol directive

    Format

      .UNDEFINE_REG  regsym

69.1  –  Parameter

 regsym

    A currently defined floating-point or integer register symbol.

69.2  –  Description

    The register symbol that you specify as the argument to the
    .UNDEFINED_REG directive is no longer a register symbol. Starting
    with the statement that follows the .UNDEFINE_REG directive, you
    can use the symbol as a MACRO-64 identifier.

69.3  –  Notes

    o  If you specify a MACRO-64 identifier that is not currently
       defined as a register symbol, the .UNDEFINE_REG directive has
       no effect.

69.4  –  Example

           .DEFINE_IREG  X1    R5      ; X1 is integer register 5
           .UNDEFINE_REG X1            ; X1 is an identifier again
           .DEFINE_IREG  X1    7       ; X1 is integer register 7 -
 no
                                        ;  redefinition and no warning

            $ROUTINE F0                 ; Error: F0 is a register and
                                        ;  cannot be used as an
                                        ;  identifier
            .UNDEFINE_REG F0            ; F0 is no longer a register
            $ROUTINE F0                 ; Ok now

70  –  .WARN

    Warning directive

    Format

      .WARN  quoted-literal

70.1  –  Parameter

 quoted-literal

    The string of characters enclosed in quotes are displayed during
    assembly.

70.2  –  Description

    .WARN causes the assembler to display a warning message on the
    terminal or in the batch log file, and in the listing file (if
    there is one).

70.3  –  Notes

    o  .PRINT, .WARN, and .ERROR are directives that display
       messages. You can use them to display information indicating
       an unexpected or important assembly condition.

    o  This directive also accepts VAX MACRO syntax. See the
       VAX MACRO and Instruction Set Reference Manual for details.

70.4  –  Example

        .WARN "Illegal parameter value; 0 assumed"
        ^
        %MACRO64-W-
 GENWARN, Generated WARNING: Illegal parameter value; 0 assumed
        at line number 3 in file DISK$:[TEST]WARN.M64;2

71  –  .WEAK

    Weak symbol attribute directive

    Format

      .WEAK  symbol-list

71.1  –  Parameter

 symbol-list

    A list of identifiers separated by commas.

71.2  –  Description

    .WEAK specifies symbols that are either defined externally in
    another module or defined globally in the current module. .WEAK
    suppresses any object library search for the symbol.

    When .WEAK specifies a symbol that is not defined in the current
    module, the symbol is externally defined. If the linker finds the
    symbol's definition in another module, it uses that definition.
    If the linker does not find an external definition, the symbol
    has a value of 0 and the linker does not report an error. The
    linker does not search a library for the symbol, but if a module
    brought in from a library for another reason contains the symbol
    definition, the linker uses it.

    When .WEAK specifies a symbol that is defined in the current
    module, the symbol is considered to be globally defined. However,
    if this module is inserted in an object library, this symbol
    is not inserted in the library's symbol table. Consequently,
    searching the library at link time to resolve this symbol does
    not cause the module to be included.

71.3  –  Example

            .WEAK A,B,C
        A:: .WORD 5     ; A and B are weak global definitions
        B:: .QUAD 6
            .ADDRESS C  ; C is a weak external reference

72  –  .WORD

    Word storage directive

    Format

      .WORD  expression-list

72.1  –  Parameter

 expression-list

    One or more expressions separated by commas.

72.2  –  Description

    .WORD generates successive words (2 bytes) of data in the object
    module.

72.3  –  Notes

    o  The expression is first evaluated as a quadword and then
       truncated to a word. The value of the expression should be
       in the range of -32,768 to +32,767 for signed data or 0 to
       65,535 for unsigned data. The assembler displays an error if
       the high-order 6 bytes of the quadword expression have a value
       other than zero or ^XFFFFFFFFFFFF.

    o  The assembler truncates on the left of an integer or external
       value.

    o  Addresses are not allowed with .WORD.

    o  You can only use this directive within data or mixed psects
       (psects that have either the NOEXE or MIX attributes).

    o  If automatic data alignment is enabled, this directive aligns
       the current location counter to a word (16-bit) boundary
       before allocating storage.

72.4  –  Example

        .WORD 5,6,7
Close Help