   This file documents the GNU Assembler "as".

   Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 Free Software
Foundation, Inc.

   Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

   Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.

   Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions.

Linker Sections
===============

   `ld' deals with just four kinds of sections, summarized below.

*named sections*
*text section*
*data section*
     These sections hold your program.  `as' and `ld' treat them as
     separate but equal sections.  Anything you can say of one section
     is true another.  When the program is running, however, it is
     customary for the text section to be unalterable.  The text
     section is often shared among processes: it contains instructions,
     constants and the like.  The data section of a running program is
     usually alterable: for example, C variables would be stored in the
     data section.

*bss section*
     This section contains zeroed bytes when your program begins
     running.  It is used to hold unitialized variables or common
     storage.  The length of each partial program's bss section is
     important, but because it starts out containing zeroed bytes there
     is no need to store explicit zero bytes in the object file.  The
     bss section was invented to eliminate those explicit zeros from
     object files.

*absolute section*
     Address 0 of this section is always "relocated" to runtime address
     0.  This is useful if you want to refer to an address that `ld'
     must not change when relocating.  In this sense we speak of
     absolute addresses being "unrelocatable": they do not change
     during relocation.

*undefined section*
     This "section" is a catch-all for address references to objects
     not in the preceding sections.

   An idealized example of three relocatable sections follows.  The
example uses the traditional section names `.text' and `.data'.  Memory
addresses are on the horizontal axis.

                           +-----+----+--+
     partial program # 1:  |ttttt|dddd|00|
                           +-----+----+--+

                           text   data bss
                           seg.   seg. seg.

                           +---+---+---+
     partial program # 2:  |TTT|DDD|000|
                           +---+---+---+

                           +--+---+-----+--+----+---+-----+~~
     linked program:       |  |TTT|ttttt|  |dddd|DDD|00000|
                           +--+---+-----+--+----+---+-----+~~

         addresses:        0 ...

Assembler Internal Sections
===========================

   These sections are meant only for the internal use of `as'.  They
have no meaning at run-time.  You do not really need to know about these
sections for most purposes; but they can be mentioned in `as' warning
messages, so it might be helpful to have an idea of their meanings to
`as'.  These sections are used to permit the value of every expression
in your assembly language program to be a section-relative address.

ASSEMBLER-INTERNAL-LOGIC-ERROR!
     An internal assembler logic error has been found.  This means
     there is a bug in the assembler.

expr section
     The assembler stores complex expression internally as combinations
     of symbols.  When it needs to represent an expression as a symbol,
     it puts it in the expr section.

Sub-Sections
============

   Assembled bytes conventionally fall into two sections: text and data.
You may have separate groups of data in named sections that you want to
end up near to each other in the object file, even though they are not
contiguous in the assembler source.  `as' allows you to use
"subsections" for this purpose.  Within each section, there can be
numbered subsections with values from 0 to 8192.  Objects assembled
into the same subsection go into the object file together with other
objects in the same subsection.  For example, a compiler might want to
store constants in the text section, but might not want to have them
interspersed with the program being assembled.  In this case, the
compiler could issue a `.text 0' before each section of code being
output, and a `.text 1' before each group of constants being output.

   Subsections are optional.  If you do not use subsections, everything
goes in subsection number zero.

   Each subsection is zero-padded up to a multiple of four bytes.
(Subsections may be padded a different amount on different flavors of
`as'.)

   Subsections appear in your object file in numeric order, lowest
numbered to highest.  (All this to be compatible with other people's
assemblers.) The object file contains no representation of subsections;
`ld' and other programs that manipulate object files see no trace of
them.  They just see all your text subsections as a text section, and
all your data subsections as a data section.

   To specify which subsection you want subsequent statements assembled
into, use a numeric argument to specify it, in a `.text EXPRESSION' or
a `.data EXPRESSION' statement.  When generating COFF output, you can
also use an extra subsection argument with arbitrary named sections:
`.section NAME, EXPRESSION'.  EXPRESSION should be an absolute
expression.  (see Expressions.)  If you just say `.text' then
`.text 0' is assumed.  Likewise `.data' means `.data 0'.  Assembly
begins in `text 0'.  For instance:
     .text 0     # The default subsection is text 0 anyway.
     .ascii "This lives in the first text subsection. *"
     .text 1
     .ascii "But this lives in the second text subsection."
     .data 0
     .ascii "This lives in the data section,"
     .ascii "in the first data subsection."
     .text 0
     .ascii "This lives in the first text section,"
     .ascii "immediately following the asterisk (*)."

   Each section has a "location counter" incremented by one for every
byte assembled into that section.  Because subsections are merely a
convenience restricted to `as' there is no concept of a subsection
location counter.  There is no way to directly manipulate a location
counter--but the `.align' directive changes it, and any label
definition captures its current value.  The location counter of the
section where statements are being assembled is said to be the "active"
location counter.

bss Section
===========

   The bss section is used for local common variable storage.  You may
allocate address space in the bss section, but you may not dictate data
to load into it before your program executes.  When your program starts
running, all the contents of the bss section are zeroed bytes.

   The `.lcomm' pseudo-op defines a symbol in the bss section; see
`.lcomm'.

   The `.comm' pseudo-op may be used to declare a common symbol, which
is another form of uninitialized symbol; see `.comm'.

   When assembling for a target which supports multiple sections, such
as ELF or COFF, you may switch into the `.bss' section and define
symbols as usual; see `.section'.  You may only assemble
zero values into the section.  Typically the section will only contain
symbol definitions and `.skip' directives (see `.skip').

Symbols
*******

   Symbols are a central concept: the programmer uses symbols to name
things, the linker uses symbols to link, and the debugger uses symbols
to debug.

     *Warning:* `as' does not place symbols in the object file in the
     same order they were declared.  This may break some debuggers.

Labels
======

   A "label" is written as a symbol immediately followed by a colon
`:'.  The symbol then represents the current value of the active
location counter, and is, for example, a suitable instruction operand.
You are warned if you use the same symbol to represent two different
locations: the first definition overrides any other definitions.

   On the HPPA, the usual form for a label need not be immediately
followed by a colon, but instead must start in column zero.  Only one
label may be defined on a single line.  To work around this, the HPPA
version of `as' also provides a special directive `.label' for defining
labels more flexibly.

Giving Symbols Other Values
===========================

   A symbol can be given an arbitrary value by writing a symbol,
followed by an equals sign `=', followed by an expression (see
Expressions.).  This is equivalent to using the `.set' directive.
See `.set'.

Symbol Names
============

   Symbol names begin with a letter or with one of `._'.  On most
machines, you can also use `$' in symbol names; exceptions are noted in
Machine Dependencies.  That character may be followed by any
string of digits, letters, dollar signs (unless otherwise noted in
Machine Dependencies), and underscores.  For the AMD 29K
family, `?' is also allowed in the body of a symbol name, though not at
its beginning.

   Case of letters is significant: `foo' is a different symbol name
than `Foo'.

   Each symbol has exactly one name.  Each name in an assembly language
program refers to exactly one symbol.  You may use that symbol name any
number of times in a program.

Local Symbol Names
------------------

   Local symbols help compilers and programmers use names temporarily.
There are ten local symbol names, which are re-used throughout the
program.  You may refer to them using the names `0' `1' ... `9'.  To
define a local symbol, write a label of the form `N:' (where N
represents any digit).  To refer to the most recent previous definition
of that symbol write `Nb', using the same digit as when you defined the
label.  To refer to the next definition of a local label, write
`Nf'--where N gives you a choice of 10 forward references.  The `b'
stands for "backwards" and the `f' stands for "forwards".

   Local symbols are not emitted by the current GNU C compiler.

   There is no restriction on how you can use these labels, but
remember that at any point in the assembly you can refer to at most 10
prior local labels and to at most 10 forward local labels.

   Local symbol names are only a notation device.  They are immediately
transformed into more conventional symbol names before the assembler
uses them.  The symbol names stored in the symbol table, appearing in
error messages and optionally emitted to the object file have these
parts:

`L'
     All local labels begin with `L'. Normally both `as' and `ld'
     forget symbols that start with `L'. These labels are used for
     symbols you are never intended to see.  If you use the `-L' option
     then `as' retains these symbols in the object file. If you also
     instruct `ld' to retain these symbols, you may use them in
     debugging.

`DIGIT'
     If the label is written `0:' then the digit is `0'.  If the label
     is written `1:' then the digit is `1'.  And so on up through `9:'.

``C-A''
     This unusual character is included so you do not accidentally
     invent a symbol of the same name.  The character has ASCII value
     `\001'.

`*ordinal number*'
     This is a serial number to keep the labels distinct.  The first
     `0:' gets the number `1'; The 15th `0:' gets the number `15';
     *etc.*.  Likewise for the other labels `1:' through `9:'.

   For instance, the first `1:' is named `L1`C-A'1', the 44th `3:' is
named `L3`C-A'44'.

The Special Dot Symbol
======================

   The special symbol `.' refers to the current address that `as' is
assembling into.  Thus, the expression `melvin: .long .' defines
`melvin' to contain its own address.  Assigning a value to `.' is
treated the same as a `.org' directive.  Thus, the expression `.=.+4'
is the same as saying `.space 4'.

Symbol Attributes
=================

   Every symbol has, as well as its name, the attributes "Value" and
"Type".  Depending on output format, symbols can also have auxiliary
attributes.

   If you use a symbol without defining it, `as' assumes zero for all
these attributes, and probably won't warn you.  This makes the symbol
an externally defined symbol, which is generally what you would want.

Value
-----

   The value of a symbol is (usually) 32 bits.  For a symbol which
labels a location in the text, data, bss or absolute sections the value
is the number of addresses from the start of that section to the label.
Naturally for text, data and bss sections the value of a symbol changes
as `ld' changes section base addresses during linking.  Absolute
symbols' values do not change during linking: that is why they are
called absolute.

   The value of an undefined symbol is treated in a special way.  If it
is 0 then the symbol is not defined in this assembler source file, and
`ld' tries to determine its value from other files linked into the same
program.  You make this kind of symbol simply by mentioning a symbol
name without defining it.  A non-zero value represents a `.comm' common
declaration.  The value is how much common storage to reserve, in bytes
(addresses).  The symbol refers to the first address of the allocated
storage.

Type
----

   The type attribute of a symbol contains relocation (section)
information, any flag settings indicating that a symbol is external, and
(optionally), other information for linkers and debuggers.  The exact
format depends on the object-code output format in use.

Symbol Attributes: `a.out'
--------------------------

Descriptor
..........

   This is an arbitrary 16-bit value.  You may establish a symbol's
descriptor value by using a `.desc' statement (see `.desc').
A descriptor value means nothing to `as'.

Other
.....

   This is an arbitrary 8-bit value.  It means nothing to `as'.

Symbol Attributes for COFF
--------------------------

   The COFF format supports a multitude of auxiliary symbol attributes;
like the primary symbol attributes, they are set between `.def' and
`.endef' directives.

Primary Attributes
..................

   The symbol name is set with `.def'; the value and type,
respectively, with `.val' and `.type'.

Auxiliary Attributes
....................

   The `as' directives `.dim', `.line', `.scl', `.size', and `.tag' can
generate auxiliary symbol table information for COFF.

Symbol Attributes for SOM
-------------------------

   The SOM format for the HPPA supports a multitude of symbol
attributes set with the `.EXPORT' and `.IMPORT' directives.

   The attributes are described in `HP9000 Series 800 Assembly Language
Reference Manual' (HP 92432-90001) under the `IMPORT' and `EXPORT'
assembler directive documentation.

Expressions
***********

   An "expression" specifies an address or numeric value.  Whitespace
may precede and/or follow an expression.

   The result of an expression must be an absolute number, or else an
offset into a particular section.  If an expression is not absolute,
and there is not enough information when `as' sees the expression to
know its section, a second pass over the source program might be
necessary to interpret the expression--but the second pass is currently
not implemented.  `as' aborts with an error message in this situation.

Empty Expressions
=================

   An empty expression has no value: it is just whitespace or null.
Wherever an absolute expression is required, you may omit the
expression, and `as' assumes a value of (absolute) 0.  This is
compatible with other assemblers.

Integer Expressions
===================

   An "integer expression" is one or more *arguments* delimited by
*operators*.

Arguments
---------

   "Arguments" are symbols, numbers or subexpressions.  In other
contexts arguments are sometimes called "arithmetic operands".  In this
manual, to avoid confusing them with the "instruction operands" of the
machine language, we use the term "argument" to refer to parts of
expressions only, reserving the word "operand" to refer only to machine
instruction operands.

   Symbols are evaluated to yield {SECTION NNN} where SECTION is one of
text, data, bss, absolute, or undefined.  NNN is a signed, 2's
complement 32 bit integer.

   Numbers are usually integers.

   A number can be a flonum or bignum.  In this case, you are warned
that only the low order 32 bits are used, and `as' pretends these 32
bits are an integer.  You may write integer-manipulating instructions
that act on exotic constants, compatible with other assemblers.

   Subexpressions are a left parenthesis `(' followed by an integer
expression, followed by a right parenthesis `)'; or a prefix operator
followed by an argument.

Operators
---------

   "Operators" are arithmetic functions, like `+' or `%'.  Prefix
operators are followed by an argument.  Infix operators appear between
their arguments.  Operators may be preceded and/or followed by
whitespace.

Prefix Operator
---------------

   `as' has the following "prefix operators".  They each take one
argument, which must be absolute.

`-'
     "Negation".  Two's complement negation.

`~'
     "Complementation".  Bitwise not.

Infix Operators
---------------

   "Infix operators" take two arguments, one on either side.  Operators
have precedence, but operations with equal precedence are performed left
to right.  Apart from `+' or `-', both arguments must be absolute, and
the result is absolute.

  1. Highest Precedence

    `*'
          "Multiplication".

    `/'
          "Division".  Truncation is the same as the C operator `/'

    `%'
          "Remainder".

    `<'
    `<<'
          "Shift Left".  Same as the C operator `<<'.

    `>'
    `>>'
          "Shift Right".  Same as the C operator `>>'.

  2. Intermediate precedence

    `|'
          "Bitwise Inclusive Or".

    `&'
          "Bitwise And".

    `^'
          "Bitwise Exclusive Or".

    `!'
          "Bitwise Or Not".

  3. Lowest Precedence

    `+'
          "Addition".  If either argument is absolute, the result has
          the section of the other argument.  You may not add together
          arguments from different sections.

    `-'
          "Subtraction".  If the right argument is absolute, the result
          has the section of the left argument.  If both arguments are
          in the same section, the result is absolute.  You may not
          subtract arguments from different sections.

   In short, it's only meaningful to add or subtract the *offsets* in an
address; you can only have a defined section in one of the two
arguments.

Assembler Directives
********************

   All assembler directives have names that begin with a period (`.').
The rest of the name is letters, usually in lower case.

   This chapter discusses directives that are available regardless of
the target machine configuration for the GNU assembler.  Some machine
configurations provide additional directives.  See Machine Dependencies.

`.abort'
========

   This directive stops the assembly immediately.  It is for
compatibility with other assemblers.  The original idea was that the
assembly language source would be piped into the assembler.  If the
sender of the source quit, it could use this directive tells `as' to
quit also.  One day `.abort' will not be supported.

`.ABORT'
========

   When producing COFF output, `as' accepts this directive as a synonym
for `.abort'.

   When producing `b.out' output, `as' accepts this directive, but
ignores it.

`.align ABS-EXPR, ABS-EXPR, ABS-EXPR'
=====================================

   Pad the location counter (in the current subsection) to a particular
storage boundary.  The first expression (which must be absolute) is the
alignment required, as described below.

   The second expression (also absolute) gives the fill value to be
stored in the padding bytes.  It (and the comma) may be omitted.  If it
is omitted, the padding bytes are normally zero.  However, on some
systems, if the section is marked as containing code and the fill value
is omitted, the space is filled with no-op instructions.

   The third expression is also absolute, and is also optional.  If it
is present, it is the maximum number of bytes that should be skipped by
this alignment directive.  If doing the alignment would require
skipping more bytes than the specified maximum, then the alignment is
not done at all.  You can omit the fill value (the second argument)
entirely by simply using two commas after the required alignment; this
can be useful if you want the alignment to be filled with no-op
instructions when appropriate.

   The way the required alignment is specified varies from system to
system.  For the a29k, hppa, m68k, m88k, w65, sparc, and Hitachi SH,
and i386 using ELF format, the first expression is the alignment
request in bytes.  For example `.align 8' advances the location counter
until it is a multiple of 8.  If the location counter is already a
multiple of 8, no change is needed.

   For other systems, including the i386 using a.out format, it is the
number of low-order zero bits the location counter must have after
advancement.  For example `.align 3' advances the location counter
until it a multiple of 8.  If the location counter is already a
multiple of 8, no change is needed.

   This inconsistency is due to the different behaviors of the various
native assemblers for these systems which GAS must emulate.  GAS also
provides `.balign' and `.p2align' directives, described later, which
have a consistent behavior across all architectures (but are specific
to GAS).

`.app-file STRING'
==================

   `.app-file' (which may also be spelled `.file') tells `as' that we
are about to start a new logical file.  STRING is the new file name.
In general, the filename is recognized whether or not it is surrounded
by quotes `"'; but if you wish to specify an empty file name is
permitted, you must give the quotes-`""'.  This statement may go away in
future: it is only recognized to be compatible with old `as' programs.

`.ascii "STRING"'...
====================

   `.ascii' expects zero or more string literals (see Strings.)
separated by commas.  It assembles each string (with no automatic
trailing zero byte) into consecutive addresses.

`.asciz "STRING"'...
====================

   `.asciz' is just like `.ascii', but each string is followed by a
zero byte.  The "z" in `.asciz' stands for "zero".

`.balign[wl] ABS-EXPR, ABS-EXPR, ABS-EXPR'
==========================================

   Pad the location counter (in the current subsection) to a particular
storage boundary.  The first expression (which must be absolute) is the
alignment request in bytes.  For example `.balign 8' advances the
location counter until it is a multiple of 8.  If the location counter
is already a multiple of 8, no change is needed.

   The second expression (also absolute) gives the fill value to be
stored in the padding bytes.  It (and the comma) may be omitted.  If it
is omitted, the padding bytes are normally zero.  However, on some
systems, if the section is marked as containing code and the fill value
is omitted, the space is filled with no-op instructions.

   The third expression is also absolute, and is also optional.  If it
is present, it is the maximum number of bytes that should be skipped by
this alignment directive.  If doing the alignment would require
skipping more bytes than the specified maximum, then the alignment is
not done at all.  You can omit the fill value (the second argument)
entirely by simply using two commas after the required alignment; this
can be useful if you want the alignment to be filled with no-op
instructions when appropriate.

   The `.balignw' and `.balignl' directives are variants of the
`.balign' directive.  The `.balignw' directive treats the fill pattern
as a two byte word value.  The `.balignl' directives treats the fill
pattern as a four byte longword value.  For example, `.balignw
4,0x368d' will align to a multiple of 4.  If it skips two bytes, they
will be filled in with the value 0x368d (the exact placement of the
bytes depends upon the endianness of the processor).  If it skips 1 or
3 bytes, the fill value is undefined.

`.byte EXPRESSIONS'
===================

   `.byte' expects zero or more expressions, separated by commas.  Each
expression is assembled into the next byte.

`.comm SYMBOL , LENGTH '
========================

   `.comm' declares a common symbol named SYMBOL.  When linking, a
common symbol in one object file may be merged with a defined or common
symbol of the same name in another object file.  If `ld' does not see a
definition for the symbol-just one or more common symbols-then it will
allocate LENGTH bytes of uninitialized memory.  LENGTH must be an
absolute expression.  If `ld' sees multiple common symbols with the
same name, and they do not all have the same size, it will allocate
space using the largest size.

   When using ELF, the `.comm' directive takes an optional third
argument.  This is the desired alignment of the symbol, specified as a
byte boundary (for example, an alignment of 16 means that the least
significant 4 bits of the address should be zero).  The alignment must
be an absolute expression, and it must be a power of two.  If `ld'
allocates uninitialized memory for the common symbol, it will use the
alignment when placing the symbol.  If no alignment is specified, `as'
will set the alignment to the largest power of two less than or equal
to the size of the symbol, up to a maximum of 16.

   The syntax for `.comm' differs slightly on the HPPA.  The syntax is
`SYMBOL .comm, LENGTH'; SYMBOL is optional.

`.data SUBSECTION'
==================

   `.data' tells `as' to assemble the following statements onto the end
of the data subsection numbered SUBSECTION (which is an absolute
expression).  If SUBSECTION is omitted, it defaults to zero.

`.def NAME'
===========

   Begin defining debugging information for a symbol NAME; the
definition extends until the `.endef' directive is encountered.

   This directive is only observed when `as' is configured for COFF
format output; when producing `b.out', `.def' is recognized, but
ignored.

`.desc SYMBOL, ABS-EXPRESSION'
==============================

   This directive sets the descriptor of the symbol (see Symbol Attributes.)
to the low 16 bits of an absolute expression.

   The `.desc' directive is not available when `as' is configured for
COFF output; it is only for `a.out' or `b.out' object format.  For the
sake of compatibility, `as' accepts it, but produces no output, when
configured for COFF.

`.dim'
======

   This directive is generated by compilers to include auxiliary
debugging information in the symbol table.  It is only permitted inside
`.def'/`.endef' pairs.

   `.dim' is only meaningful when generating COFF format output; when
`as' is generating `b.out', it accepts this directive but ignores it.

`.double FLONUMS'
=================

   `.double' expects zero or more flonums, separated by commas.  It
assembles floating point numbers.  The exact kind of floating point
numbers emitted depends on how `as' is configured.  See Machine Dependencies.

`.eject'
========

   Force a page break at this point, when generating assembly listings.

`.else'
=======

   `.else' is part of the `as' support for conditional assembly; see
`.if'.  It marks the beginning of a section of code to be
assembled if the condition for the preceding `.if' was false.

`.endef'
========

   This directive flags the end of a symbol definition begun with
`.def'.

   `.endef' is only meaningful when generating COFF format output; if
`as' is configured to generate `b.out', it accepts this directive but
ignores it.

`.endif'
========

   `.endif' is part of the `as' support for conditional assembly; it
marks the end of a block of code that is only assembled conditionally.
See `.if'.

`.equ SYMBOL, EXPRESSION'
=========================

   This directive sets the value of SYMBOL to EXPRESSION.  It is
synonymous with `.set'; see `.set'.

   The syntax for `equ' on the HPPA is `SYMBOL .equ EXPRESSION'.

`.equiv SYMBOL, EXPRESSION'
===========================

   The `.equiv' directive is like `.equ' and `.set', except that the
assembler will signal an error if SYMBOL is already defined.

   Except for the contents of the error message, this is roughly
equivalent to
     .ifdef SYM
     .err
     .endif
     .equ SYM,VAL

`.err'
======

   If `as' assembles a `.err' directive, it will print an error message
and, unless the `-Z' option was used, it will not generate an object
file.  This can be used to signal error an conditionally compiled code.

`.extern'
=========

   `.extern' is accepted in the source program--for compatibility with
other assemblers--but it is ignored.  `as' treats all undefined symbols
as external.

`.file STRING'
==============

   `.file' (which may also be spelled `.app-file') tells `as' that we
are about to start a new logical file.  STRING is the new file name.
In general, the filename is recognized whether or not it is surrounded
by quotes `"'; but if you wish to specify an empty file name, you must
give the quotes-`""'.  This statement may go away in future: it is only
recognized to be compatible with old `as' programs.  In some
configurations of `as', `.file' has already been removed to avoid
conflicts with other assemblers.  See Machine Dependencies.

`.fill REPEAT , SIZE , VALUE'
=============================

   RESULT, SIZE and VALUE are absolute expressions.  This emits REPEAT
copies of SIZE bytes.  REPEAT may be zero or more.  SIZE may be zero or
more, but if it is more than 8, then it is deemed to have the value 8,
compatible with other people's assemblers.  The contents of each REPEAT
bytes is taken from an 8-byte number.  The highest order 4 bytes are
zero.  The lowest order 4 bytes are VALUE rendered in the byte-order of
an integer on the computer `as' is assembling for.  Each SIZE bytes in
a repetition is taken from the lowest order SIZE bytes of this number.
Again, this bizarre behavior is compatible with other people's
assemblers.

   SIZE and VALUE are optional.  If the second comma and VALUE are
absent, VALUE is assumed zero.  If the first comma and following tokens
are absent, SIZE is assumed to be 1.

`.float FLONUMS'
================

   This directive assembles zero or more flonums, separated by commas.
It has the same effect as `.single'.  The exact kind of floating point
numbers emitted depends on how `as' is configured.  See Machine Dependencies.

`.global SYMBOL', `.globl SYMBOL'
=================================

   `.global' makes the symbol visible to `ld'.  If you define SYMBOL in
your partial program, its value is made available to other partial
programs that are linked with it.  Otherwise, SYMBOL takes its
attributes from a symbol of the same name from another file linked into
the same program.

   Both spellings (`.globl' and `.global') are accepted, for
compatibility with other assemblers.

   On the HPPA, `.global' is not always enough to make it accessible to
other partial programs.  You may need the HPPA-only `.EXPORT' directive
as well.  See HPPA Assembler Directives.

`.hword EXPRESSIONS'
====================

   This expects zero or more EXPRESSIONS, and emits a 16 bit number for
each.

   This directive is a synonym for `.short'; depending on the target
architecture, it may also be a synonym for `.word'.

`.ident'
========

   This directive is used by some assemblers to place tags in object
files.  `as' simply accepts the directive for source-file compatibility
with such assemblers, but does not actually emit anything for it.

`.if ABSOLUTE EXPRESSION'
=========================

   `.if' marks the beginning of a section of code which is only
considered part of the source program being assembled if the argument
(which must be an ABSOLUTE EXPRESSION) is non-zero.  The end of the
conditional section of code must be marked by `.endif' (see `.endif');
optionally, you may include code for the alternative
condition, flagged by `.else' (see `.else').

   The following variants of `.if' are also supported:
`.ifdef SYMBOL'
     Assembles the following section of code if the specified SYMBOL
     has been defined.

`.ifndef SYMBOL'
`.ifnotdef SYMBOL'
     Assembles the following section of code if the specified SYMBOL
     has not been defined.  Both spelling variants are equivalent.

`.include "FILE"'
=================

   This directive provides a way to include supporting files at
specified points in your source program.  The code from FILE is
assembled as if it followed the point of the `.include'; when the end
of the included file is reached, assembly of the original file
continues.  You can control the search paths used with the `-I'
command-line option (see Command-Line Options).  Quotation
marks are required around FILE.

`.int EXPRESSIONS'
==================

   Expect zero or more EXPRESSIONS, of any section, separated by commas.
For each expression, emit a number that, at run time, is the value of
that expression.  The byte order and bit size of the number depends on
what kind of target the assembly is for.

`.irp SYMBOL,VALUES'...
=======================

   Evaluate a sequence of statements assigning different values to
SYMBOL.  The sequence of statements starts at the `.irp' directive, and
is terminated by an `.endr' directive.  For each VALUE, SYMBOL is set
to VALUE, and the sequence of statements is assembled.  If no VALUE is
listed, the sequence of statements is assembled once, with SYMBOL set
to the null string.  To refer to SYMBOL within the sequence of
statements, use \SYMBOL.

   For example, assembling

             .irp    param,1,2,3
             move    d\param,sp@-
             .endr

   is equivalent to assembling

             move    d1,sp@-
             move    d2,sp@-
             move    d3,sp@-

`.irpc SYMBOL,VALUES'...
========================

   Evaluate a sequence of statements assigning different values to
SYMBOL.  The sequence of statements starts at the `.irpc' directive,
and is terminated by an `.endr' directive.  For each character in VALUE,
SYMBOL is set to the character, and the sequence of statements is
assembled.  If no VALUE is listed, the sequence of statements is
assembled once, with SYMBOL set to the null string.  To refer to SYMBOL
within the sequence of statements, use \SYMBOL.

   For example, assembling

             .irpc    param,123
             move    d\param,sp@-
             .endr

   is equivalent to assembling

             move    d1,sp@-
             move    d2,sp@-
             move    d3,sp@-

`.lcomm SYMBOL , LENGTH'
========================

   Reserve LENGTH (an absolute expression) bytes for a local common
denoted by SYMBOL.  The section and value of SYMBOL are those of the
new local common.  The addresses are allocated in the bss section, so
that at run-time the bytes start off zeroed.  SYMBOL is not declared
global (see `.global'), so is normally not visible to `ld'.

   Some targets permit a third argument to be used with `.lcomm'.  This
argument specifies the desired alignment of the symbol in the bss
section.

   The syntax for `.lcomm' differs slightly on the HPPA.  The syntax is
`SYMBOL .lcomm, LENGTH'; SYMBOL is optional.

`.lflags'
=========

   `as' accepts this directive, for compatibility with other
assemblers, but ignores it.

`.line LINE-NUMBER'
===================

   Change the logical line number.  LINE-NUMBER must be an absolute
expression.  The next line has that logical line number.  Therefore any
other statements on the current line (after a statement separator
character) are reported as on logical line number LINE-NUMBER - 1.  One
day `as' will no longer support this directive: it is recognized only
for compatibility with existing assembler programs.

   *Warning:* In the AMD29K configuration of as, this command is not
available; use the synonym `.ln' in that context.

   Even though this is a directive associated with the `a.out' or
`b.out' object-code formats, `as' still recognizes it when producing
COFF output, and treats `.line' as though it were the COFF `.ln' *if*
it is found outside a `.def'/`.endef' pair.

   Inside a `.def', `.line' is, instead, one of the directives used by
compilers to generate auxiliary symbol information for debugging.

`.linkonce [TYPE]'
==================

   Mark the current section so that the linker only includes a single
copy of it.  This may be used to include the same section in several
different object files, but ensure that the linker will only include it
once in the final output file.  The `.linkonce' pseudo-op must be used
for each instance of the section.  Duplicate sections are detected
based on the section name, so it should be unique.

   This directive is only supported by a few object file formats; as of
this writing, the only object file format which supports it is the
Portable Executable format used on Windows NT.

   The TYPE argument is optional.  If specified, it must be one of the
following strings.  For example:
     .linkonce same_size
   Not all types may be supported on all object file formats.

`discard'
     Silently discard duplicate sections.  This is the default.

`one_only'
     Warn if there are duplicate sections, but still keep only one copy.

`same_size'
     Warn if any of the duplicates have different sizes.

`same_contents'
     Warn if any of the duplicates do not have exactly the same
     contents.

`.ln LINE-NUMBER'
=================

   `.ln' is a synonym for `.line'.

`.mri VAL'
==========

   If VAL is non-zero, this tells `as' to enter MRI mode.  If VAL is
zero, this tells `as' to exit MRI mode.  This change affects code
assembled until the next `.mri' directive, or until the end of the
file.  See MRI mode.

`.list'
=======

   Control (in conjunction with the `.nolist' directive) whether or not
assembly listings are generated.  These two directives maintain an
internal counter (which is zero initially).   `.list' increments the
counter, and `.nolist' decrements it.  Assembly listings are generated
whenever the counter is greater than zero.

   By default, listings are disabled.  When you enable them (with the
`-a' command line option; see Command-Line Options), the
initial value of the listing counter is one.

`.long EXPRESSIONS'
===================

   `.long' is the same as `.int', see `.int'.

`.macro'
========

   The commands `.macro' and `.endm' allow you to define macros that
generate assembly output.  For example, this definition specifies a
macro `sum' that puts a sequence of numbers into memory:

             .macro  sum from=0, to=5
             .long   \from
             .if     \to-\from
             sum     "(\from+1)",\to
             .endif
             .endm

With that definition, `SUM 0,5' is equivalent to this assembly input:

             .long   0
             .long   1
             .long   2
             .long   3
             .long   4
             .long   5

`.macro MACNAME'
`.macro MACNAME MACARGS ...'
     Begin the definition of a macro called MACNAME.  If your macro
     definition requires arguments, specify their names after the macro
     name, separated by commas or spaces.  You can supply a default
     value for any macro argument by following the name with `=DEFLT'.
     For example, these are all valid `.macro' statements:

    `.macro comm'
          Begin the definition of a macro called `comm', which takes no
          arguments.

    `.macro plus1 p, p1'
    `.macro plus1 p p1'
          Either statement begins the definition of a macro called
          `plus1', which takes two arguments; within the macro
          definition, write `\p' or `\p1' to evaluate the arguments.

    `.macro reserve_str p1=0 p2'
          Begin the definition of a macro called `reserve_str', with two
          arguments.  The first argument has a default value, but not
          the second.  After the definition is complete, you can call
          the macro either as `reserve_str A,B' (with `\p1' evaluating
          to A and `\p2' evaluating to B), or as `reserve_str ,B' (with
          `\p1' evaluating as the default, in this case `0', and `\p2'
          evaluating to B).

     When you call a macro, you can specify the argument values either
     by position, or by keyword.  For example, `sum 9,17' is equivalent
     to `sum to=17, from=9'.

`.endm'
     Mark the end of a macro definition.

`.exitm'
     Exit early from the current macro definition.

`\@'
     `as' maintains a counter of how many macros it has executed in
     this pseudo-variable; you can copy that number to your output with
     `\@', but *only within a macro definition*.