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