123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- @c Copyright (C) 2000-2015 Free Software Foundation, Inc.
- @c This is part of the GAS manual.
- @c For copying conditions, see the file as.texinfo.
- @ifset GENERIC
- @page
- @node ESA/390-Dependent
- @chapter ESA/390 Dependent Features
- @end ifset
- @ifclear GENERIC
- @node Machine Dependencies
- @chapter ESA/390 Dependent Features
- @end ifclear
- @cindex i370 support
- @cindex ESA/390 support
- @menu
- * ESA/390 Notes:: Notes
- * ESA/390 Options:: Options
- * ESA/390 Syntax:: Syntax
- * ESA/390 Floating Point:: Floating Point
- * ESA/390 Directives:: ESA/390 Machine Directives
- * ESA/390 Opcodes:: Opcodes
- @end menu
- @node ESA/390 Notes
- @section Notes
- The ESA/390 @code{@value{AS}} port is currently intended to be a back-end
- for the @sc{gnu} @sc{cc} compiler. It is not HLASM compatible, although
- it does support a subset of some of the HLASM directives. The only
- supported binary file format is ELF; none of the usual MVS/VM/OE/USS
- object file formats, such as ESD or XSD, are supported.
- When used with the @sc{gnu} @sc{cc} compiler, the ESA/390 @code{@value{AS}}
- will produce correct, fully relocated, functional binaries, and has been
- used to compile and execute large projects. However, many aspects should
- still be considered experimental; these include shared library support,
- dynamically loadable objects, and any relocation other than the 31-bit
- relocation.
- @node ESA/390 Options
- @section Options
- @code{@value{AS}} has no machine-dependent command-line options for the ESA/390.
- @cindex ESA/390 Syntax
- @node ESA/390 Syntax
- @section Syntax
- The opcode/operand syntax follows the ESA/390 Principles of Operation
- manual; assembler directives and general syntax are loosely based on the
- prevailing AT&T/SVR4/ELF/Solaris style notation. HLASM-style directives
- are @emph{not} supported for the most part, with the exception of those
- described herein.
- A leading dot in front of directives is optional, and the case of
- directives is ignored; thus for example, .using and USING have the same
- effect.
- A colon may immediately follow a label definition. This is
- simply for compatibility with how most assembly language programmers
- write code.
- @samp{#} is the line comment character.
- @samp{;} can be used instead of a newline to separate statements.
- Since @samp{$} has no special meaning, you may use it in symbol names.
- Registers can be given the symbolic names r0..r15, fp0, fp2, fp4, fp6.
- By using thesse symbolic names, @code{@value{AS}} can detect simple
- syntax errors. The name rarg or r.arg is a synonym for r11, rtca or r.tca
- for r12, sp, r.sp, dsa r.dsa for r13, lr or r.lr for r14, rbase or r.base
- for r3 and rpgt or r.pgt for r4.
- @samp{*} is the current location counter. Unlike @samp{.} it is always
- relative to the last USING directive. Note that this means that
- expressions cannot use multiplication, as any occurrence of @samp{*}
- will be interpreted as a location counter.
- All labels are relative to the last USING. Thus, branches to a label
- always imply the use of base+displacement.
- Many of the usual forms of address constants / address literals
- are supported. Thus,
- @example
- .using *,r3
- L r15,=A(some_routine)
- LM r6,r7,=V(some_longlong_extern)
- A r1,=F'12'
- AH r0,=H'42'
- ME r6,=E'3.1416'
- MD r6,=D'3.14159265358979'
- O r6,=XL4'cacad0d0'
- .ltorg
- @end example
- should all behave as expected: that is, an entry in the literal
- pool will be created (or reused if it already exists), and the
- instruction operands will be the displacement into the literal pool
- using the current base register (as last declared with the @code{.using}
- directive).
- @node ESA/390 Floating Point
- @section Floating Point
- @cindex floating point, ESA/390 (@sc{ieee})
- @cindex ESA/390 floating point (@sc{ieee})
- The assembler generates only @sc{ieee} floating-point numbers. The older
- floating point formats are not supported.
- @node ESA/390 Directives
- @section ESA/390 Assembler Directives
- @code{@value{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 @code{.using} and @code{.ltorg}
- @cindex ESA/390-only directives
- These are the additional directives in @code{@value{AS}} for the ESA/390:
- @table @code
- @item .dc
- A small subset of the usual DC directive is supported.
- @item .drop @var{regno}
- Stop using @var{regno} as the base register. The @var{regno} must
- have been previously declared with a @code{.using} directive in the
- same section as the current section.
- @item .ebcdic @var{string}
- Emit the EBCDIC equivalent of the indicated string. The emitted string
- will be null terminated. Note that the directives @code{.string} etc. emit
- ascii strings by default.
- @item EQU
- The standard HLASM-style EQU directive is not supported; however, the
- standard @code{@value{AS}} directive .equ can be used to the same effect.
- @item .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 @code{.using} must have been previously
- specified in the same section.
- @item .using @var{expr},@var{regno}
- Use @var{regno} as the base register for all subsequent RX, RS, and SS form
- instructions. The @var{expr} will be evaluated to obtain the base address;
- usually, @var{expr} will merely be @samp{*}.
- This assembler allows two @code{.using} directives to be simultaneously
- outstanding, one in the @code{.text} section, and one in another section
- (typically, the @code{.data} section). This feature allows
- dynamically loaded objects to be implemented in a relatively
- straightforward way. A @code{.using} directive must always be specified
- in the @code{.text} section; this will specify the base register that
- will be used for branches in the @code{.text} section. A second
- @code{.using} may be specified in another section; this will specify
- the base register that is used for non-label address literals.
- When a second @code{.using} is specified, then the subsequent
- @code{.ltorg} must be put in the same section; otherwise an error will
- result.
- Thus, for example, the following code uses @code{r3} to address branch
- targets and @code{r4} to address the literal pool, which has been written
- to the @code{.data} section. The is, the constants @code{=A(some_routine)},
- @code{=H'42'} and @code{=E'3.1416'} will all appear in the @code{.data}
- section.
- @example
- .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
- @end example
- Note that this dual-@code{.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.
- @end table
- @node ESA/390 Opcodes
- @section Opcodes
- For detailed information on the ESA/390 machine instruction set, see
- @cite{ESA/390 Principles of Operation} (IBM Publication Number DZ9AR004).
|