ESA/390 Directives - Using as
Description: Using as

Next: ESA/390 Opcodes, Previous: ESA/390 Floating Point, Up: ESA/390-Dependent

#### 9.12.5 ESA/390 Assembler Directives

`as` for the ESA/390 supports all of the standard ELF/SVR4 assembler directives that are documented in the main part of this documentation. Several additional directives are supported in order to implement the ESA/390 addressing model. The most important of these are `.using` and `.ltorg`

These are the additional directives in `as` for the ESA/390:

`.dc`
  A small subset of the usual DC directive is supported.
`.drop` regno
  Stop using regno as the base register. The regno must have been previously declared with a `.using` directive in the same section as the current section.
`.ebcdic` string
  Emit the EBCDIC equivalent of the indicated string. The emitted string will be null terminated. Note that the directives `.string` etc. emit ascii strings by default.
`EQU`
  The standard HLASM-style EQU directive is not supported; however, the standard `as` directive .equ can be used to the same effect.
`.ltorg`
  Dump the literal pool accumulated so far; begin a new literal pool. The literal pool will be written in the current section; in order to generate correct assembly, a `.using` must have been previously specified in the same section.
`.using` expr`,`regno
  Use regno as the base register for all subsequent RX, RS, and SS form instructions. The expr will be evaluated to obtain the base address; usually, expr will merely be ‘`*`’.

  This assembler allows two `.using` directives to be simultaneously outstanding, one in the `.text` section, and one in another section (typically, the `.data` section). This feature allows dynamically loaded objects to be implemented in a relatively straightforward way. A `.using` directive must always be specified in the `.text` section; this will specify the base register that will be used for branches in the `.text` section. A second `.using` may be specified in another section; this will specify the base register that is used for non-label address literals. When a second `.using` is specified, then the subsequent `.ltorg` must be put in the same section; otherwise an error will result.

  Thus, for example, the following code uses `r3` to address branch targets and `r4` to address the literal pool, which has been written to the `.data` section. The is, the constants `=A(some_routine)`, `=H'42'` and `=E'3.1416'` will all appear in the `.data` section.

                .data
                	.using  LITPOOL,r4
                .text
                	BASR	r3,0
                	.using	*,r3
                        B       START
                	.long	LITPOOL
                START:
                	L	r4,4(,r3)
                	L	r15,=A(some_routine)
                	LTR	r15,r15
                	BNE	LABEL
                	AH	r0,=H'42'
                LABEL:
                	ME	r6,=E'3.1416'
                .data
                LITPOOL:
                	.ltorg

  Note that this dual-`.using` directive semantics extends and is not compatible with HLASM semantics. Note that this assembler directive does not support the full range of HLASM semantics.