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