\input texinfo @c                               -*-Texinfo-*-
@c  Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
@c  2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
@c  Free Software Foundation, Inc.
@c UPDATE!!  On future updates--
@c   (1)   check for new machine-dep cmdline options in
@c         md_parse_option definitions in config/tc-*.c
@c   (2)   for platform-specific directives, examine md_pseudo_op
@c         in config/tc-*.c
@c   (3)   for object-format specific directives, examine obj_pseudo_op
@c         in config/obj-*.c       
@c   (4)   portable directives in potable[] in read.c
@c %**start of header
@setfilename as.info
@c ---config---
@macro gcctabopt{body}
@code{\body\}
@end macro
@c defaults, config file may override:
@set have-stabs
@c ---
@c man begin NAME
@c ---
@include asconfig.texi
@include bfdver.texi
@c ---
@c man end
@c ---
@c common OR combinations of conditions
@ifset COFF
@set COFF-ELF
@end ifset
@ifset ELF
@set COFF-ELF
@end ifset
@ifset AOUT
@set aout-bout
@end ifset
@ifset ARM/Thumb
@set ARM
@end ifset
@ifset BOUT
@set aout-bout
@end ifset
@ifset H8/300
@set H8
@end ifset
@ifset SH
@set H8
@end ifset
@ifset HPPA
@set abnormal-separator
@end ifset
@c ------------
@ifset GENERIC
@settitle Using @value{AS}
@end ifset
@ifclear GENERIC
@settitle Using @value{AS} (@value{TARGET})
@end ifclear
@setchapternewpage odd
@c %**end of header

@c @smallbook
@c @set SMALL
@c WARE! Some of the machine-dependent sections contain tables of machine
@c instructions.  Except in multi-column format, these tables look silly.
@c Unfortunately, Texinfo doesn't have a general-purpose multi-col format, so
@c the multi-col format is faked within @example sections.
@c 
@c Again unfortunately, the natural size that fits on a page, for these tables,
@c is different depending on whether or not smallbook is turned on.
@c This matters, because of order: text flow switches columns at each page
@c break.
@c 
@c The format faked in this source works reasonably well for smallbook,
@c not well for the default large-page format.  This manual expects that if you
@c turn on @smallbook, you will also uncomment the "@set SMALL" to enable the
@c tables in question.  You can turn on one without the other at your
@c discretion, of course. 
@ifinfo
@set SMALL
@c the insn tables look just as silly in info files regardless of smallbook,
@c might as well show 'em anyways.
@end ifinfo

@ifinfo
@format
START-INFO-DIR-ENTRY
* As: (as).                     The GNU assembler.
* Gas: (as).                    The GNU assembler.
END-INFO-DIR-ENTRY
@end format
@end ifinfo

@finalout
@syncodeindex ky cp

@copying
This file documents the GNU Assembler "@value{AS}".

@c man begin COPYRIGHT
Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002,
2006, 2007, 2008, 2009 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, with no Front-Cover Texts, and with no
Back-Cover Texts.  A copy of the license is included in the
section entitled ``GNU Free Documentation License''.

@c man end
@end copying

@titlepage
@title Using @value{AS}
@subtitle The @sc{gnu} Assembler
@ifclear GENERIC
@subtitle for the @value{TARGET} family
@end ifclear
@ifset VERSION_PACKAGE
@sp 1
@subtitle @value{VERSION_PACKAGE}
@end ifset
@sp 1
@subtitle Version @value{VERSION}
@sp 1
@sp 13
The Free Software Foundation Inc.@: thanks The Nice Computer
Company of Australia for loaning Dean Elsner to write the
first (Vax) version of @command{as} for Project @sc{gnu}.
The proprietors, management and staff of TNCCA thank FSF for
distracting the boss while they got some work
done.
@sp 3
@author Dean Elsner, Jay Fenlason & friends
@page
@tex
{\parskip=0pt
\hfill {\it Using {\tt @value{AS}}}\par
\hfill Edited by Cygnus Support\par
}
%"boxit" macro for figures:
%Modified from Knuth's ``boxit'' macro from TeXbook (answer to exercise 21.3)
\gdef\boxit#1#2{\vbox{\hrule\hbox{\vrule\kern3pt
     \vbox{\parindent=0pt\parskip=0pt\hsize=#1\kern3pt\strut\hfil
#2\hfil\strut\kern3pt}\kern3pt\vrule}\hrule}}%box with visible outline
\gdef\ibox#1#2{\hbox to #1{#2\hfil}\kern8pt}% invisible box
@end tex

@vskip 0pt plus 1filll
Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002,
2006, 2007, 2008, 2009 Free Software Foundation, Inc.

      Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.3
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, with no Front-Cover Texts, and with no
      Back-Cover Texts.  A copy of the license is included in the
      section entitled ``GNU Free Documentation License''.

@end titlepage
@contents

@ifnottex
@node Top
@top Using @value{AS}

This file is a user guide to the @sc{gnu} assembler @command{@value{AS}}
@ifset VERSION_PACKAGE
@value{VERSION_PACKAGE}
@end ifset
version @value{VERSION}.
@ifclear GENERIC
This version of the file describes @command{@value{AS}} configured to generate
code for @value{TARGET} architectures.
@end ifclear

This document is distributed under the terms of the GNU Free
Documentation License.  A copy of the license is included in the
section entitled ``GNU Free Documentation License''.

@menu
* Overview::                    Overview
* Invoking::                    Command-Line Options
* Syntax::                      Syntax
* Sections::                    Sections and Relocation
* Symbols::                     Symbols
* Expressions::                 Expressions
* Pseudo Ops::                  Assembler Directives
@ifset ELF
* Object Attributes::           Object Attributes
@end ifset
* Machine Dependencies::        Machine Dependent Features
* Reporting Bugs::              Reporting Bugs
* Acknowledgements::            Who Did What
* GNU Free Documentation License::  GNU Free Documentation License
* AS Index::                    AS Index
@end menu
@end ifnottex

@node Overview
@chapter Overview
@iftex
This manual is a user guide to the @sc{gnu} assembler @command{@value{AS}}.
@ifclear GENERIC
This version of the manual describes @command{@value{AS}} configured to generate
code for @value{TARGET} architectures.
@end ifclear
@end iftex

@cindex invocation summary
@cindex option summary
@cindex summary of options
Here is a brief summary of how to invoke @command{@value{AS}}.  For details,
see @ref{Invoking,,Command-Line Options}.

@c man title AS the portable GNU assembler.

@ignore
@c man begin SEEALSO
gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
@c man end
@end ignore

@c We don't use deffn and friends for the following because they seem
@c to be limited to one line for the header.
@smallexample
@c man begin SYNOPSIS
@value{AS} [@b{-a}[@b{cdghlns}][=@var{file}]] [@b{--alternate}] [@b{-D}]
 [@b{--debug-prefix-map} @var{old}=@var{new}]
 [@b{--defsym} @var{sym}=@var{val}] [@b{-f}] [@b{-g}] [@b{--gstabs}]
 [@b{--gstabs+}] [@b{--gdwarf-2}] [@b{--help}] [@b{-I} @var{dir}] [@b{-J}]
 [@b{-K}] [@b{-L}] [@b{--listing-lhs-width}=@var{NUM}]
 [@b{--listing-lhs-width2}=@var{NUM}] [@b{--listing-rhs-width}=@var{NUM}]
 [@b{--listing-cont-lines}=@var{NUM}] [@b{--keep-locals}] [@b{-o}
 @var{objfile}] [@b{-R}] [@b{--reduce-memory-overheads}] [@b{--statistics}]
 [@b{-v}] [@b{-version}] [@b{--version}] [@b{-W}] [@b{--warn}]
 [@b{--fatal-warnings}] [@b{-w}] [@b{-x}] [@b{-Z}] [@b{@@@var{FILE}}]
 [@b{--target-help}] [@var{target-options}]
 [@b{--}|@var{files} @dots{}]
@c
@c Target dependent options are listed below.  Keep the list sorted.
@c Add an empty line for separation. 
@ifset ALPHA

@emph{Target Alpha options:}
   [@b{-m@var{cpu}}]
   [@b{-mdebug} | @b{-no-mdebug}]
   [@b{-replace} | @b{-noreplace}]
   [@b{-relax}] [@b{-g}] [@b{-G@var{size}}]
   [@b{-F}] [@b{-32addr}]
@end ifset
@ifset ARC

@emph{Target ARC options:}
   [@b{-marc[5|6|7|8]}]
   [@b{-EB}|@b{-EL}]
@end ifset
@ifset ARM

@emph{Target ARM options:}
@c Don't document the deprecated options
   [@b{-mcpu}=@var{processor}[+@var{extension}@dots{}]]
   [@b{-march}=@var{architecture}[+@var{extension}@dots{}]]
   [@b{-mfpu}=@var{floating-point-format}]
   [@b{-mfloat-abi}=@var{abi}]
   [@b{-meabi}=@var{ver}]
   [@b{-mthumb}]
   [@b{-EB}|@b{-EL}]
   [@b{-mapcs-32}|@b{-mapcs-26}|@b{-mapcs-float}|
    @b{-mapcs-reentrant}]
   [@b{-mthumb-interwork}] [@b{-k}]
@end ifset
@ifset CRIS

@emph{Target CRIS options:}
   [@b{--underscore} | @b{--no-underscore}]
   [@b{--pic}] [@b{-N}]
   [@b{--emulation=criself} | @b{--emulation=crisaout}]
   [@b{--march=v0_v10} | @b{--march=v10} | @b{--march=v32} | @b{--march=common_v10_v32}]
@c Deprecated -- deliberately not documented.
@c [@b{-h}] [@b{-H}]
@end ifset
@ifset D10V

@emph{Target D10V options:}
   [@b{-O}]
@end ifset
@ifset D30V

@emph{Target D30V options:}
   [@b{-O}|@b{-n}|@b{-N}]
@end ifset
@ifset H8

@emph{Target H8/300 options:}
   [-h-tick-hex]
@end ifset
@ifset HPPA
@c HPPA has no machine-dependent assembler options (yet).
@end ifset
@ifset I80386

@emph{Target i386 options:}
   [@b{--32}|@b{--64}] [@b{-n}]
   [@b{-march}=@var{CPU}[+@var{EXTENSION}@dots{}]] [@b{-mtune}=@var{CPU}] 
@end ifset
@ifset I960

@emph{Target i960 options:}
@c see md_parse_option in tc-i960.c
   [@b{-ACA}|@b{-ACA_A}|@b{-ACB}|@b{-ACC}|@b{-AKA}|@b{-AKB}|
    @b{-AKC}|@b{-AMC}]
   [@b{-b}] [@b{-no-relax}]
@end ifset
@ifset IA64

@emph{Target IA-64 options:}
   [@b{-mconstant-gp}|@b{-mauto-pic}]
   [@b{-milp32}|@b{-milp64}|@b{-mlp64}|@b{-mp64}]
   [@b{-mle}|@b{mbe}]
   [@b{-mtune=itanium1}|@b{-mtune=itanium2}]
   [@b{-munwind-check=warning}|@b{-munwind-check=error}]
   [@b{-mhint.b=ok}|@b{-mhint.b=warning}|@b{-mhint.b=error}]
   [@b{-x}|@b{-xexplicit}] [@b{-xauto}] [@b{-xdebug}]
@end ifset
@ifset IP2K

@emph{Target IP2K options:}
   [@b{-mip2022}|@b{-mip2022ext}]
@end ifset
@ifset M32C

@emph{Target M32C options:}
   [@b{-m32c}|@b{-m16c}] [-relax] [-h-tick-hex]
@end ifset
@ifset M32R

@emph{Target M32R options:}
   [@b{--m32rx}|@b{--[no-]warn-explicit-parallel-conflicts}|
   @b{--W[n]p}]
@end ifset
@ifset M680X0

@emph{Target M680X0 options:}
   [@b{-l}] [@b{-m68000}|@b{-m68010}|@b{-m68020}|@dots{}]
@end ifset
@ifset M68HC11

@emph{Target M68HC11 options:}
   [@b{-m68hc11}|@b{-m68hc12}|@b{-m68hcs12}]
   [@b{-mshort}|@b{-mlong}]
   [@b{-mshort-double}|@b{-mlong-double}]
   [@b{--force-long-branches}] [@b{--short-branches}]
   [@b{--strict-direct-mode}] [@b{--print-insn-syntax}]
   [@b{--print-opcodes}] [@b{--generate-example}]
@end ifset
@ifset MCORE

@emph{Target MCORE options:}
   [@b{-jsri2bsr}] [@b{-sifilter}] [@b{-relax}]
   [@b{-mcpu=[210|340]}]
@end ifset
@ifset MIPS

@emph{Target MIPS options:}
   [@b{-nocpp}] [@b{-EL}] [@b{-EB}] [@b{-O}[@var{optimization level}]]
   [@b{-g}[@var{debug level}]] [@b{-G} @var{num}] [@b{-KPIC}] [@b{-call_shared}]
   [@b{-non_shared}] [@b{-xgot} [@b{-mvxworks-pic}]
   [@b{-mabi}=@var{ABI}] [@b{-32}] [@b{-n32}] [@b{-64}] [@b{-mfp32}] [@b{-mgp32}]
   [@b{-march}=@var{CPU}] [@b{-mtune}=@var{CPU}] [@b{-mips1}] [@b{-mips2}]
   [@b{-mips3}] [@b{-mips4}] [@b{-mips5}] [@b{-mips32}] [@b{-mips32r2}]
   [@b{-mips64}] [@b{-mips64r2}]
   [@b{-construct-floats}] [@b{-no-construct-floats}]
   [@b{-trap}] [@b{-no-break}] [@b{-break}] [@b{-no-trap}]
   [@b{-mfix7000}] [@b{-mno-fix7000}]
   [@b{-mips16}] [@b{-no-mips16}]
   [@b{-msmartmips}] [@b{-mno-smartmips}]
   [@b{-mips3d}] [@b{-no-mips3d}]
   [@b{-mdmx}] [@b{-no-mdmx}]
   [@b{-mdsp}] [@b{-mno-dsp}]
   [@b{-mdspr2}] [@b{-mno-dspr2}]
   [@b{-mmt}] [@b{-mno-mt}]
   [@b{-mdebug}] [@b{-no-mdebug}]
   [@b{-mpdr}] [@b{-mno-pdr}]
@end ifset
@ifset MMIX

@emph{Target MMIX options:}
   [@b{--fixed-special-register-names}] [@b{--globalize-symbols}]
   [@b{--gnu-syntax}] [@b{--relax}] [@b{--no-predefined-symbols}]
   [@b{--no-expand}] [@b{--no-merge-gregs}] [@b{-x}]
   [@b{--linker-allocated-gregs}]
@end ifset
@ifset PDP11

@emph{Target PDP11 options:}
   [@b{-mpic}|@b{-mno-pic}] [@b{-mall}] [@b{-mno-extensions}]
   [@b{-m}@var{extension}|@b{-mno-}@var{extension}]
   [@b{-m}@var{cpu}] [@b{-m}@var{machine}]  
@end ifset
@ifset PJ

@emph{Target picoJava options:}
   [@b{-mb}|@b{-me}]
@end ifset
@ifset PPC

@emph{Target PowerPC options:}
   [@b{-mpwrx}|@b{-mpwr2}|@b{-mpwr}|@b{-m601}|@b{-mppc}|@b{-mppc32}|@b{-m603}|@b{-m604}|
    @b{-m403}|@b{-m405}|@b{-mppc64}|@b{-m620}|@b{-mppc64bridge}|@b{-mbooke}]
   [@b{-mcom}|@b{-many}|@b{-maltivec}|@b{-mvsx}] [@b{-memb}]
   [@b{-mregnames}|@b{-mno-regnames}]
   [@b{-mrelocatable}|@b{-mrelocatable-lib}]
   [@b{-mlittle}|@b{-mlittle-endian}|@b{-mbig}|@b{-mbig-endian}]
   [@b{-msolaris}|@b{-mno-solaris}]
@end ifset
@ifset S390

@emph{Target s390 options:}
   [@b{-m31}|@b{-m64}] [@b{-mesa}|@b{-mzarch}] [@b{-march}=@var{CPU}]
   [@b{-mregnames}|@b{-mno-regnames}]
   [@b{-mwarn-areg-zero}]
@end ifset
@ifset SCORE

@emph{Target SCORE options:}
   [@b{-EB}][@b{-EL}][@b{-FIXDD}][@b{-NWARN}]
   [@b{-SCORE5}][@b{-SCORE5U}][@b{-SCORE7}][@b{-SCORE3}]
   [@b{-march=score7}][@b{-march=score3}]
   [@b{-USE_R1}][@b{-KPIC}][@b{-O0}][@b{-G} @var{num}][@b{-V}]
@end ifset
@ifset SPARC

@emph{Target SPARC options:}
@c The order here is important.  See c-sparc.texi.
   [@b{-Av6}|@b{-Av7}|@b{-Av8}|@b{-Asparclet}|@b{-Asparclite}
    @b{-Av8plus}|@b{-Av8plusa}|@b{-Av9}|@b{-Av9a}]
   [@b{-xarch=v8plus}|@b{-xarch=v8plusa}] [@b{-bump}]
   [@b{-32}|@b{-64}]
@end ifset
@ifset TIC54X

@emph{Target TIC54X options:}
 [@b{-mcpu=54[123589]}|@b{-mcpu=54[56]lp}] [@b{-mfar-mode}|@b{-mf}] 
 [@b{-merrors-to-file} @var{<filename>}|@b{-me} @var{<filename>}]
@end ifset

@ifset Z80

@emph{Target Z80 options:}
  [@b{-z80}] [@b{-r800}]
  [@b{ -ignore-undocumented-instructions}] [@b{-Wnud}]
  [@b{ -ignore-unportable-instructions}] [@b{-Wnup}]
  [@b{ -warn-undocumented-instructions}] [@b{-Wud}]
  [@b{ -warn-unportable-instructions}] [@b{-Wup}]
  [@b{ -forbid-undocumented-instructions}] [@b{-Fud}]
  [@b{ -forbid-unportable-instructions}] [@b{-Fup}]
@end ifset

@ifset Z8000
@c Z8000 has no machine-dependent assembler options
@end ifset
@ifset XTENSA

@emph{Target Xtensa options:}
 [@b{--[no-]text-section-literals}] [@b{--[no-]absolute-literals}]
 [@b{--[no-]target-align}] [@b{--[no-]longcalls}]
 [@b{--[no-]transform}]
 [@b{--rename-section} @var{oldname}=@var{newname}]
@end ifset
@c man end
@end smallexample

@c man begin OPTIONS

@table @gcctabopt
@include at-file.texi

@item -a[cdghlmns]
Turn on listings, in any of a variety of ways:

@table @gcctabopt
@item -ac
omit false conditionals

@item -ad
omit debugging directives

@item -ag
include general information, like @value{AS} version and options passed

@item -ah
include high-level source

@item -al
include assembly

@item -am
include macro expansions

@item -an
omit forms processing

@item -as
include symbols

@item =file
set the name of the listing file
@end table

You may combine these options; for example, use @samp{-aln} for assembly
listing without forms processing.  The @samp{=file} option, if used, must be
the last one.  By itself, @samp{-a} defaults to @samp{-ahls}.

@item --alternate
Begin in alternate macro mode.
@ifclear man
@xref{Altmacro,,@code{.altmacro}}.
@end ifclear

@item -D
Ignored.  This option is accepted for script compatibility with calls to
other assemblers.

@item --debug-prefix-map @var{old}=@var{new}
When assembling files in directory @file{@var{old}}, record debugging
information describing them as in @file{@var{new}} instead.

@item --defsym @var{sym}=@var{value}
Define the symbol @var{sym} to be @var{value} before assembling the input file.
@var{value} must be an integer constant.  As in C, a leading @samp{0x}
indicates a hexadecimal value, and a leading @samp{0} indicates an octal
value.  The value of the symbol can be overridden inside a source file via the
use of a @code{.set} pseudo-op.

@item -f
``fast''---skip whitespace and comment preprocessing (assume source is
compiler output).

@item -g
@itemx --gen-debug
Generate debugging information for each assembler source line using whichever
debug format is preferred by the target.  This currently means either STABS,
ECOFF or DWARF2.

@item --gstabs
Generate stabs debugging information for each assembler line.  This
may help debugging assembler code, if the debugger can handle it.

@item --gstabs+
Generate stabs debugging information for each assembler line, with GNU
extensions that probably only gdb can handle, and that could make other
debuggers crash or refuse to read your program.  This
may help debugging assembler code.  Currently the only GNU extension is
the location of the current working directory at assembling time.

@item --gdwarf-2
Generate DWARF2 debugging information for each assembler line.  This
may help debugging assembler code, if the debugger can handle it.  Note---this
option is only supported by some targets, not all of them.

@item --help
Print a summary of the command line options and exit.

@item --target-help
Print a summary of all target specific options and exit.

@item -I @var{dir}
Add directory @var{dir} to the search list for @code{.include} directives.

@item -J
Don't warn about signed overflow.

@item -K
@ifclear DIFF-TBL-KLUGE
This option is accepted but has no effect on the @value{TARGET} family.
@end ifclear
@ifset DIFF-TBL-KLUGE
Issue warnings when difference tables altered for long displacements.
@end ifset

@item -L
@itemx --keep-locals
Keep (in the symbol table) local symbols.  These symbols start with
system-specific local label prefixes, typically @samp{.L} for ELF systems
or @samp{L} for traditional a.out systems.
@ifclear man
@xref{Symbol Names}.
@end ifclear

@item --listing-lhs-width=@var{number}
Set the maximum width, in words, of the output data column for an assembler
listing to @var{number}.

@item --listing-lhs-width2=@var{number}
Set the maximum width, in words, of the output data column for continuation
lines in an assembler listing to @var{number}.

@item --listing-rhs-width=@var{number}
Set the maximum width of an input source line, as displayed in a listing, to
@var{number} bytes.

@item --listing-cont-lines=@var{number}
Set the maximum number of lines printed in a listing for a single line of input
to @var{number} + 1.

@item -o @var{objfile}
Name the object-file output from @command{@value{AS}} @var{objfile}.

@item -R
Fold the data section into the text section.

@kindex --hash-size=@var{number}
Set the default size of GAS's hash tables to a prime number close to
@var{number}.  Increasing this value can reduce the length of time it takes the
assembler to perform its tasks, at the expense of increasing the assembler's
memory requirements.  Similarly reducing this value can reduce the memory
requirements at the expense of speed.

@item --reduce-memory-overheads
This option reduces GAS's memory requirements, at the expense of making the
assembly processes slower.  Currently this switch is a synonym for
@samp{--hash-size=4051}, but in the future it may have other effects as well.

@item --statistics
Print the maximum space (in bytes) and total time (in seconds) used by
assembly.

@item --strip-local-absolute
Remove local absolute symbols from the outgoing symbol table.

@item -v
@itemx -version
Print the @command{as} version.

@item --version
Print the @command{as} version and exit.

@item -W
@itemx --no-warn
Suppress warning messages.

@item --fatal-warnings
Treat warnings as errors.

@item --warn
Don't suppress warning messages or treat them as errors.

@item -w
Ignored.

@item -x
Ignored.

@item -Z
Generate an object file even after errors.

@item -- | @var{files} @dots{}
Standard input, or source files to assemble.

@end table

@ifset ARC
The following options are available when @value{AS} is configured for
an ARC processor.

@table @gcctabopt
@item -marc[5|6|7|8]
This option selects the core processor variant.
@item -EB | -EL
Select either big-endian (-EB) or little-endian (-EL) output.
@end table
@end ifset

@ifset ARM
The following options are available when @value{AS} is configured for the ARM
processor family.

@table @gcctabopt
@item -mcpu=@var{processor}[+@var{extension}@dots{}]
Specify which ARM processor variant is the target.
@item -march=@var{architecture}[+@var{extension}@dots{}]
Specify which ARM architecture variant is used by the target.
@item -mfpu=@var{floating-point-format}
Select which Floating Point architecture is the target.
@item -mfloat-abi=@var{abi}
Select which floating point ABI is in use.
@item -mthumb
Enable Thumb only instruction decoding.
@item -mapcs-32 | -mapcs-26 | -mapcs-float | -mapcs-reentrant
Select which procedure calling convention is in use.
@item -EB | -EL
Select either big-endian (-EB) or little-endian (-EL) output.
@item -mthumb-interwork
Specify that the code has been generated with interworking between Thumb and
ARM code in mind.
@item -k
Specify that PIC code has been generated.
@end table
@end ifset

@ifset CRIS
See the info pages for documentation of the CRIS-specific options.
@end ifset

@ifset D10V
The following options are available when @value{AS} is configured for
a D10V processor.
@table @gcctabopt
@cindex D10V optimization
@cindex optimization, D10V
@item -O
Optimize output by parallelizing instructions.
@end table
@end ifset

@ifset D30V
The following options are available when @value{AS} is configured for a D30V
processor.
@table @gcctabopt
@cindex D30V optimization
@cindex optimization, D30V
@item -O
Optimize output by parallelizing instructions.

@cindex D30V nops
@item -n
Warn when nops are generated.

@cindex D30V nops after 32-bit multiply
@item -N
Warn when a nop after a 32-bit multiply instruction is generated.
@end table
@end ifset

@ifset I960
The following options are available when @value{AS} is configured for the
Intel 80960 processor.

@table @gcctabopt
@item -ACA | -ACA_A | -ACB | -ACC | -AKA | -AKB | -AKC | -AMC
Specify which variant of the 960 architecture is the target.

@item -b
Add code to collect statistics about branches taken.

@item -no-relax
Do not alter compare-and-branch instructions for long displacements;
error if necessary.

@end table
@end ifset

@ifset IP2K
The following options are available when @value{AS} is configured for the
Ubicom IP2K series.

@table @gcctabopt

@item -mip2022ext
Specifies that the extended IP2022 instructions are allowed.

@item -mip2022
Restores the default behaviour, which restricts the permitted instructions to
just the basic IP2022 ones.

@end table
@end ifset

@ifset M32C
The following options are available when @value{AS} is configured for the
Renesas M32C and M16C processors.

@table @gcctabopt

@item -m32c
Assemble M32C instructions.

@item -m16c
Assemble M16C instructions (the default).

@item -relax
Enable support for link-time relaxations.

@item -h-tick-hex
Support H'00 style hex constants in addition to 0x00 style.

@end table
@end ifset

@ifset M32R
The following options are available when @value{AS} is configured for the
Renesas M32R (formerly Mitsubishi M32R) series.

@table @gcctabopt

@item --m32rx
Specify which processor in the M32R family is the target.  The default
is normally the M32R, but this option changes it to the M32RX.

@item --warn-explicit-parallel-conflicts or --Wp
Produce warning messages when questionable parallel constructs are
encountered. 

@item --no-warn-explicit-parallel-conflicts or --Wnp
Do not produce warning messages when questionable parallel constructs are 
encountered. 

@end table
@end ifset

@ifset M680X0
The following options are available when @value{AS} is configured for the
Motorola 68000 series.

@table @gcctabopt

@item -l
Shorten references to undefined symbols, to one word instead of two.

@item -m68000 | -m68008 | -m68010 | -m68020 | -m68030
@itemx | -m68040 | -m68060 | -m68302 | -m68331 | -m68332
@itemx | -m68333 | -m68340 | -mcpu32 | -m5200
Specify what processor in the 68000 family is the target.  The default
is normally the 68020, but this can be changed at configuration time.

@item -m68881 | -m68882 | -mno-68881 | -mno-68882
The target machine does (or does not) have a floating-point coprocessor.
The default is to assume a coprocessor for 68020, 68030, and cpu32.  Although
the basic 68000 is not compatible with the 68881, a combination of the
two can be specified, since it's possible to do emulation of the
coprocessor instructions with the main processor.

@item -m68851 | -mno-68851
The target machine does (or does not) have a memory-management
unit coprocessor.  The default is to assume an MMU for 68020 and up.

@end table
@end ifset

@ifset PDP11

For details about the PDP-11 machine dependent features options,
see @ref{PDP-11-Options}.

@table @gcctabopt
@item -mpic | -mno-pic
Generate position-independent (or position-dependent) code.  The
default is @option{-mpic}.

@item -mall
@itemx -mall-extensions
Enable all instruction set extensions.  This is the default.

@item -mno-extensions
Disable all instruction set extensions.

@item -m@var{extension} | -mno-@var{extension}
Enable (or disable) a particular instruction set extension.

@item -m@var{cpu}
Enable the instruction set extensions supported by a particular CPU, and
disable all other extensions.

@item -m@var{machine}
Enable the instruction set extensions supported by a particular machine
model, and disable all other extensions.
@end table

@end ifset

@ifset PJ
The following options are available when @value{AS} is configured for
a picoJava processor.

@table @gcctabopt

@cindex PJ endianness
@cindex endianness, PJ
@cindex big endian output, PJ
@item -mb
Generate ``big endian'' format output.

@cindex little endian output, PJ
@item -ml
Generate ``little endian'' format output.

@end table
@end ifset

@ifset M68HC11
The following options are available when @value{AS} is configured for the
Motorola 68HC11 or 68HC12 series.

@table @gcctabopt

@item -m68hc11 | -m68hc12 | -m68hcs12
Specify what processor is the target.  The default is
defined by the configuration option when building the assembler.

@item -mshort
Specify to use the 16-bit integer ABI.

@item -mlong
Specify to use the 32-bit integer ABI.  

@item -mshort-double
Specify to use the 32-bit double ABI.  

@item -mlong-double
Specify to use the 64-bit double ABI.  

@item --force-long-branches
Relative branches are turned into absolute ones. This concerns
conditional branches, unconditional branches and branches to a
sub routine.

@item -S | --short-branches
Do not turn relative branches into absolute ones
when the offset is out of range.

@item --strict-direct-mode
Do not turn the direct addressing mode into extended addressing mode
when the instruction does not support direct addressing mode.

@item --print-insn-syntax
Print the syntax of instruction in case of error.

@item --print-opcodes
print the list of instructions with syntax and then exit.

@item --generate-example
print an example of instruction for each possible instruction and then exit.
This option is only useful for testing @command{@value{AS}}.

@end table
@end ifset

@ifset SPARC
The following options are available when @command{@value{AS}} is configured
for the SPARC architecture:

@table @gcctabopt
@item -Av6 | -Av7 | -Av8 | -Asparclet | -Asparclite
@itemx -Av8plus | -Av8plusa | -Av9 | -Av9a
Explicitly select a variant of the SPARC architecture.

@samp{-Av8plus} and @samp{-Av8plusa} select a 32 bit environment.
@samp{-Av9} and @samp{-Av9a} select a 64 bit environment.

@samp{-Av8plusa} and @samp{-Av9a} enable the SPARC V9 instruction set with
UltraSPARC extensions.

@item -xarch=v8plus | -xarch=v8plusa
For compatibility with the Solaris v9 assembler.  These options are
equivalent to -Av8plus and -Av8plusa, respectively.

@item -bump
Warn when the assembler switches to another architecture.
@end table
@end ifset

@ifset TIC54X
The following options are available when @value{AS} is configured for the 'c54x
architecture. 

@table @gcctabopt
@item -mfar-mode
Enable extended addressing mode.  All addresses and relocations will assume
extended addressing (usually 23 bits).
@item -mcpu=@var{CPU_VERSION}
Sets the CPU version being compiled for.
@item -merrors-to-file @var{FILENAME}
Redirect error output to a file, for broken systems which don't support such
behaviour in the shell.
@end table
@end ifset

@ifset MIPS
The following options are available when @value{AS} is configured for
a @sc{mips} processor.

@table @gcctabopt
@item -G @var{num}
This option sets the largest size of an object that can be referenced
implicitly with the @code{gp} register.  It is only accepted for targets that
use ECOFF format, such as a DECstation running Ultrix.  The default value is 8.

@cindex MIPS endianness
@cindex endianness, MIPS
@cindex big endian output, MIPS
@item -EB
Generate ``big endian'' format output.

@cindex little endian output, MIPS
@item -EL
Generate ``little endian'' format output.

@cindex MIPS ISA
@item -mips1
@itemx -mips2
@itemx -mips3
@itemx -mips4
@itemx -mips5
@itemx -mips32
@itemx -mips32r2
@itemx -mips64
@itemx -mips64r2
Generate code for a particular @sc{mips} Instruction Set Architecture level.
@samp{-mips1} is an alias for @samp{-march=r3000}, @samp{-mips2} is an
alias for @samp{-march=r6000}, @samp{-mips3} is an alias for
@samp{-march=r4000} and @samp{-mips4} is an alias for @samp{-march=r8000}.
@samp{-mips5}, @samp{-mips32}, @samp{-mips32r2}, @samp{-mips64}, and
@samp{-mips64r2}
correspond to generic
@samp{MIPS V}, @samp{MIPS32}, @samp{MIPS32 Release 2}, @samp{MIPS64},
and @samp{MIPS64 Release 2}
ISA processors, respectively.

@item -march=@var{CPU}
Generate code for a particular @sc{mips} cpu.

@item -mtune=@var{cpu}
Schedule and tune for a particular @sc{mips} cpu.

@item -mfix7000
@itemx -mno-fix7000
Cause nops to be inserted if the read of the destination register
of an mfhi or mflo instruction occurs in the following two instructions.

@item -mdebug
@itemx -no-mdebug
Cause stabs-style debugging output to go into an ECOFF-style .mdebug
section instead of the standard ELF .stabs sections.

@item -mpdr
@itemx -mno-pdr
Control generation of @code{.pdr} sections.

@item -mgp32
@itemx -mfp32
The register sizes are normally inferred from the ISA and ABI, but these
flags force a certain group of registers to be treated as 32 bits wide at
all times.  @samp{-mgp32} controls the size of general-purpose registers
and @samp{-mfp32} controls the size of floating-point registers.

@item -mips16
@itemx -no-mips16
Generate code for the MIPS 16 processor.  This is equivalent to putting
@code{.set mips16} at the start of the assembly file.  @samp{-no-mips16}
turns off this option.

@item -msmartmips
@itemx -mno-smartmips
Enables the SmartMIPS extension to the MIPS32 instruction set. This is
equivalent to putting @code{.set smartmips} at the start of the assembly file.
@samp{-mno-smartmips} turns off this option.

@item -mips3d
@itemx -no-mips3d
Generate code for the MIPS-3D Application Specific Extension.
This tells the assembler to accept MIPS-3D instructions.
@samp{-no-mips3d} turns off this option.

@item -mdmx
@itemx -no-mdmx
Generate code for the MDMX Application Specific Extension.
This tells the assembler to accept MDMX instructions.
@samp{-no-mdmx} turns off this option.

@item -mdsp
@itemx -mno-dsp
Generate code for the DSP Release 1 Application Specific Extension.
This tells the assembler to accept DSP Release 1 instructions.
@samp{-mno-dsp} turns off this option.

@item -mdspr2
@itemx -mno-dspr2
Generate code for the DSP Release 2 Application Specific Extension.
This option implies -mdsp.
This tells the assembler to accept DSP Release 2 instructions.
@samp{-mno-dspr2} turns off this option.

@item -mmt
@itemx -mno-mt
Generate code for the MT Application Specific Extension.
This tells the assembler to accept MT instructions.
@samp{-mno-mt} turns off this option.

@item --construct-floats
@itemx --no-construct-floats
The @samp{--no-construct-floats} option disables the construction of
double width floating point constants by loading the two halves of the
value into the two single width floating point registers that make up
the double width register.  By default @samp{--construct-floats} is
selected, allowing construction of these floating point constants.

@cindex emulation
@item --emulation=@var{name}
This option causes @command{@value{AS}} to emulate @command{@value{AS}} configured
for some other target, in all respects, including output format (choosing
between ELF and ECOFF only), handling of pseudo-opcodes which may generate
debugging information or store symbol table information, and default
endianness.  The available configuration names are: @samp{mipsecoff},
@samp{mipself}, @samp{mipslecoff}, @samp{mipsbecoff}, @samp{mipslelf},
@samp{mipsbelf}.  The first two do not alter the default endianness from that
of the primary target for which the assembler was configured; the others change
the default to little- or big-endian as indicated by the @samp{b} or @samp{l}
in the name.  Using @samp{-EB} or @samp{-EL} will override the endianness
selection in any case.

This option is currently supported only when the primary target
@command{@value{AS}} is configured for is a @sc{mips} ELF or ECOFF target.
Furthermore, the primary target or others specified with
@samp{--enable-targets=@dots{}} at configuration time must include support for
the other format, if both are to be available.  For example, the Irix 5
configuration includes support for both.

Eventually, this option will support more configurations, with more
fine-grained control over the assembler's behavior, and will be supported for
more processors.

@item -nocpp
@command{@value{AS}} ignores this option.  It is accepted for compatibility with
the native tools.

@item --trap
@itemx --no-trap
@itemx --break
@itemx --no-break
Control how to deal with multiplication overflow and division by zero.
@samp{--trap} or @samp{--no-break} (which are synonyms) take a trap exception
(and only work for Instruction Set Architecture level 2 and higher);
@samp{--break} or @samp{--no-trap} (also synonyms, and the default) take a
break exception.

@item -n
When this option is used, @command{@value{AS}} will issue a warning every
time it generates a nop instruction from a macro.
@end table
@end ifset

@ifset MCORE
The following options are available when @value{AS} is configured for
an MCore processor.

@table @gcctabopt
@item -jsri2bsr
@itemx -nojsri2bsr
Enable or disable the JSRI to BSR transformation.  By default this is enabled.
The command line option @samp{-nojsri2bsr} can be used to disable it.

@item -sifilter
@itemx -nosifilter
Enable or disable the silicon filter behaviour.  By default this is disabled.
The default can be overridden by the @samp{-sifilter} command line option.

@item -relax
Alter jump instructions for long displacements.

@item -mcpu=[210|340]
Select the cpu type on the target hardware.  This controls which instructions
can be assembled.

@item -EB
Assemble for a big endian target.

@item -EL
Assemble for a little endian target.

@end table
@end ifset

@ifset MMIX
See the info pages for documentation of the MMIX-specific options.
@end ifset

@ifset S390
The following options are available when @value{AS} is configured for the s390
processor family.

@table @gcctabopt
@item -m31
@itemx -m64
Select the word size, either 31/32 bits or 64 bits.
@item -mesa
@item -mzarch
Select the architecture mode, either the Enterprise System
Architecture (esa) or the z/Architecture mode (zarch).
@item -march=@var{processor}
Specify which s390 processor variant is the target, @samp{g6}, @samp{g6},
@samp{z900}, @samp{z990}, @samp{z9-109}, @samp{z9-ec}, or @samp{z10}.
@item -mregnames
@itemx -mno-regnames
Allow or disallow symbolic names for registers.
@item -mwarn-areg-zero
Warn whenever the operand for a base or index register has been specified
but evaluates to zero.
@end table
@end ifset

@ifset XTENSA
The following options are available when @value{AS} is configured for
an Xtensa processor.

@table @gcctabopt
@item --text-section-literals | --no-text-section-literals
With @option{--text-@-section-@-literals}, literal pools are interspersed
in the text section.  The default is
@option{--no-@-text-@-section-@-literals}, which places literals in a
separate section in the output file.  These options only affect literals
referenced via PC-relative @code{L32R} instructions; literals for
absolute mode @code{L32R} instructions are handled separately.

@item --absolute-literals | --no-absolute-literals
Indicate to the assembler whether @code{L32R} instructions use absolute
or PC-relative addressing.  The default is to assume absolute addressing
if the Xtensa processor includes the absolute @code{L32R} addressing
option.  Otherwise, only the PC-relative @code{L32R} mode can be used.

@item --target-align | --no-target-align
Enable or disable automatic alignment to reduce branch penalties at the
expense of some code density.  The default is @option{--target-@-align}.

@item --longcalls | --no-longcalls
Enable or disable transformation of call instructions to allow calls
across a greater range of addresses.  The default is
@option{--no-@-longcalls}.

@item --transform | --no-transform
Enable or disable all assembler transformations of Xtensa instructions.
The default is @option{--transform};
@option{--no-transform} should be used only in the rare cases when the
instructions must be exactly as specified in the assembly source.

@item --rename-section @var{oldname}=@var{newname}
When generating output sections, rename the @var{oldname} section to
@var{newname}.
@end table
@end ifset

@ifset Z80
The following options are available when @value{AS} is configured for
a Z80 family processor.
@table @gcctabopt
@item -z80
Assemble for Z80 processor.
@item -r800
Assemble for R800 processor.
@item  -ignore-undocumented-instructions 
@itemx -Wnud
Assemble undocumented Z80 instructions that also work on R800 without warning.
@item  -ignore-unportable-instructions 
@itemx -Wnup
Assemble all undocumented Z80 instructions without warning.
@item  -warn-undocumented-instructions 
@itemx -Wud
Issue a warning for undocumented Z80 instructions that also work on R800.
@item  -warn-unportable-instructions 
@itemx -Wup
Issue a warning for undocumented Z80 instructions that do not work on R800.  
@item  -forbid-undocumented-instructions 
@itemx -Fud
Treat all undocumented instructions as errors.
@item  -forbid-unportable-instructions 
@itemx -Fup
Treat undocumented Z80 instructions that do not work on R800 as errors.
@end table
@end ifset

@c man end

@menu
* Manual::                      Structure of this Manual
* GNU Assembler::               The GNU Assembler
* Object Formats::              Object File Formats
* Command Line::                Command Line
* Input Files::                 Input Files
* Object::                      Output (Object) File
* Errors::                      Error and Warning Messages
@end menu

@node Manual
@section Structure of this Manual

@cindex manual, structure and purpose
This manual is intended to describe what you need to know to use
@sc{gnu} @command{@value{AS}}.  We cover the syntax expected in source files, including
notation for symbols, constants, and expressions; the directives that
@command{@value{AS}} understands; and of course how to invoke @command{@value{AS}}.

@ifclear GENERIC
We also cover special features in the @value{TARGET}
configuration of @command{@value{AS}}, including assembler directives.
@end ifclear
@ifset GENERIC
This manual also describes some of the machine-dependent features of
various flavors of the assembler.
@end ifset

@cindex machine instructions (not covered)
On the other hand, this manual is @emph{not} intended as an introduction
to programming in assembly language---let alone programming in general!
In a similar vein, we make no attempt to introduce the machine
architecture; we do @emph{not} describe the instruction set, standard
mnemonics, registers or addressing modes that are standard to a
particular architecture.
@ifset GENERIC
You may want to consult the manufacturer's
machine architecture manual for this information.
@end ifset
@ifclear GENERIC
@ifset H8/300
For information on the H8/300 machine instruction set, see @cite{H8/300
Series Programming Manual}.  For the H8/300H, see @cite{H8/300H Series
Programming Manual} (Renesas).
@end ifset
@ifset SH
For information on the Renesas (formerly Hitachi) / SuperH SH machine instruction set,
see @cite{SH-Microcomputer User's Manual} (Renesas) or
@cite{SH-4 32-bit CPU Core Architecture} (SuperH) and
@cite{SuperH (SH) 64-Bit RISC Series} (SuperH).
@end ifset
@ifset Z8000
For information on the Z8000 machine instruction set, see @cite{Z8000 CPU Technical Manual}
@end ifset
@end ifclear

@c I think this is premature---doc@cygnus.com, 17jan1991
@ignore
Throughout this manual, we assume that you are running @dfn{GNU},
the portable operating system from the @dfn{Free Software
Foundation, Inc.}.  This restricts our attention to certain kinds of
computer (in particular, the kinds of computers that @sc{gnu} can run on);
once this assumption is granted examples and definitions need less
qualification.

@command{@value{AS}} is part of a team of programs that turn a high-level
human-readable series of instructions into a low-level
computer-readable series of instructions.  Different versions of
@command{@value{AS}} are used for different kinds of computer.
@end ignore

@c There used to be a section "Terminology" here, which defined
@c "contents", "byte", "word", and "long".  Defining "word" to any
@c particular size is confusing when the .word directive may generate 16
@c bits on one machine and 32 bits on another; in general, for the user
@c version of this manual, none of these terms seem essential to define.
@c They were used very little even in the former draft of the manual;
@c this draft makes an effort to avoid them (except in names of
@c directives).

@node GNU Assembler
@section The GNU Assembler

@c man begin DESCRIPTION

@sc{gnu} @command{as} is really a family of assemblers.
@ifclear GENERIC
This manual describes @command{@value{AS}}, a member of that family which is
configured for the @value{TARGET} architectures.
@end ifclear
If you use (or have used) the @sc{gnu} assembler on one architecture, you
should find a fairly similar environment when you use it on another
architecture.  Each version has much in common with the others,
including object file formats, most assembler directives (often called
@dfn{pseudo-ops}) and assembler syntax.@refill

@cindex purpose of @sc{gnu} assembler
@command{@value{AS}} is primarily intended to assemble the output of the
@sc{gnu} C compiler @code{@value{GCC}} for use by the linker
@code{@value{LD}}.  Nevertheless, we've tried to make @command{@value{AS}}
assemble correctly everything that other assemblers for the same
machine would assemble.
@ifset VAX
Any exceptions are documented explicitly (@pxref{Machine Dependencies}).
@end ifset
@ifset M680X0
@c This remark should appear in generic version of manual; assumption
@c here is that generic version sets M680x0.
This doesn't mean @command{@value{AS}} always uses the same syntax as another
assembler for the same architecture; for example, we know of several
incompatible versions of 680x0 assembly language syntax.
@end ifset

@c man end

Unlike older assemblers, @command{@value{AS}} is designed to assemble a source
program in one pass of the source file.  This has a subtle impact on the
@kbd{.org} directive (@pxref{Org,,@code{.org}}).

@node Object Formats
@section Object File Formats

@cindex object file format
The @sc{gnu} assembler can be configured to produce several alternative
object file formats.  For the most part, this does not affect how you
write assembly language programs; but directives for debugging symbols
are typically different in different file formats.  @xref{Symbol
Attributes,,Symbol Attributes}.
@ifclear GENERIC
@ifclear MULTI-OBJ
For the @value{TARGET} target, @command{@value{AS}} is configured to produce
@value{OBJ-NAME} format object files.
@end ifclear
@c The following should exhaust all configs that set MULTI-OBJ, ideally
@ifset I960
On the @value{TARGET}, @command{@value{AS}} can be configured to produce either
@code{b.out} or COFF format object files.
@end ifset
@ifset HPPA
On the @value{TARGET}, @command{@value{AS}} can be configured to produce either
SOM or ELF format object files.
@end ifset
@end ifclear

@node Command Line
@section Command Line

@cindex command line conventions

After the program name @command{@value{AS}}, the command line may contain
options and file names.  Options may appear in any order, and may be
before, after, or between file names.  The order of file names is
significant.

@cindex standard input, as input file
@kindex --
@file{--} (two hyphens) by itself names the standard input file
explicitly, as one of the files for @command{@value{AS}} to assemble.

@cindex options, command line
Except for @samp{--} any command line argument that begins with a
hyphen (@samp{-}) is an option.  Each option changes the behavior of
@command{@value{AS}}.  No option changes the way another option works.  An
option is a @samp{-} followed by one or more letters; the case of
the letter is important.   All options are optional.

Some options expect exactly one file name to follow them.  The file
name may either immediately follow the option's letter (compatible
with older assemblers) or it may be the next command argument (@sc{gnu}
standard).  These two command lines are equivalent:

@smallexample
@value{AS} -o my-object-file.o mumble.s
@value{AS} -omy-object-file.o mumble.s
@end smallexample

@node Input Files
@section Input Files

@cindex input
@cindex source program
@cindex files, input
We use the phrase @dfn{source program}, abbreviated @dfn{source}, to
describe the program input to one run of @command{@value{AS}}.  The program may
be in one or more files; how the source is partitioned into files
doesn't change the meaning of the source.

@c I added "con" prefix to "catenation" just to prove I can overcome my
@c APL training...   doc@cygnus.com
The source program is a concatenation of the text in all the files, in the
order specified.

@c man begin DESCRIPTION
Each time you run @command{@value{AS}} it assembles exactly one source
program.  The source program is made up of one or more files.
(The standard input is also a file.)

You give @command{@value{AS}} a command line that has zero or more input file
names.  The input files are read (from left file name to right).  A
command line argument (in any position) that has no special meaning
is taken to be an input file name.

If you give @command{@value{AS}} no file names it attempts to read one input file
from the @command{@value{AS}} standard input, which is normally your terminal.  You
may have to type @key{ctl-D} to tell @command{@value{AS}} there is no more program
to assemble.

Use @samp{--} if you need to explicitly name the standard input file
in your command line.

If the source is empty, @command{@value{AS}} produces a small, empty object
file.

@c man end

@subheading Filenames and Line-numbers

@cindex input file linenumbers
@cindex line numbers, in input files
There are two ways of locating a line in the input file (or files) and
either may be used in reporting error messages.  One way refers to a line
number in a physical file; the other refers to a line number in a
``logical'' file.  @xref{Errors, ,Error and Warning Messages}.

@dfn{Physical files} are those files named in the command line given
to @command{@value{AS}}.

@dfn{Logical files} are simply names declared explicitly by assembler
directives; they bear no relation to physical files.  Logical file names help
error messages reflect the original source file, when @command{@value{AS}} source
is itself synthesized from other files.  @command{@value{AS}} understands the
@samp{#} directives emitted by the @code{@value{GCC}} preprocessor.  See also
@ref{File,,@code{.file}}.

@node Object
@section Output (Object) File

@cindex object file
@cindex output file
@kindex a.out
@kindex .o
Every time you run @command{@value{AS}} it produces an output file, which is
your assembly language program translated into numbers.  This file
is the object file.  Its default name is
@ifclear BOUT
@code{a.out}.
@end ifclear
@ifset BOUT
@ifset GENERIC
@code{a.out}, or 
@end ifset
@code{b.out} when @command{@value{AS}} is configured for the Intel 80960.
@end ifset
You can give it another name by using the @option{-o} option.  Conventionally,
object file names end with @file{.o}.  The default name is used for historical
reasons: older assemblers were capable of assembling self-contained programs
directly into a runnable program.  (For some formats, this isn't currently
possible, but it can be done for the @code{a.out} format.)

@cindex linker
@kindex ld
The object file is meant for input to the linker @code{@value{LD}}.  It contains
assembled program code, information to help @code{@value{LD}} integrate
the assembled program into a runnable file, and (optionally) symbolic
information for the debugger.

@c link above to some info file(s) like the description of a.out.
@c don't forget to describe @sc{gnu} info as well as Unix lossage.

@node Errors
@section Error and Warning Messages

@c man begin DESCRIPTION

@cindex error messages
@cindex warning messages
@cindex messages from assembler
@command{@value{AS}} may write warnings and error messages to the standard error
file (usually your terminal).  This should not happen when  a compiler
runs @command{@value{AS}} automatically.  Warnings report an assumption made so
that @command{@value{AS}} could keep assembling a flawed program; errors report a
grave problem that stops the assembly.

@c man end

@cindex format of warning messages
Warning messages have the format

@smallexample
file_name:@b{NNN}:Warning Message Text
@end smallexample

@noindent
@cindex line numbers, in warnings/errors
(where @b{NNN} is a line number).  If a logical file name has been given
(@pxref{File,,@code{.file}}) it is used for the filename, otherwise the name of
the current input file is used.  If a logical line number was given
@ifset GENERIC
(@pxref{Line,,@code{.line}})
@end ifset
then it is used to calculate the number printed,
otherwise the actual line in the current source file is printed.  The
message text is intended to be self explanatory (in the grand Unix
tradition).

@cindex format of error messages
Error messages have the format
@smallexample
file_name:@b{NNN}:FATAL:Error Message Text
@end smallexample
The file name and line number are derived as for warning
messages.  The actual message text may be rather less explanatory
because many of them aren't supposed to happen.

@node Invoking
@chapter Command-Line Options

@cindex options, all versions of assembler
This chapter describes command-line options available in @emph{all}
versions of the @sc{gnu} assembler; see @ref{Machine Dependencies},
for options specific
@ifclear GENERIC
to the @value{TARGET} target.
@end ifclear
@ifset GENERIC
to particular machine architectures.
@end ifset

@c man begin DESCRIPTION

If you are invoking @command{@value{AS}} via the @sc{gnu} C compiler,
you can use the @samp{-Wa} option to pass arguments through to the assembler.
The assembler arguments must be separated from each other (and the @samp{-Wa})
by commas.  For example:

@smallexample
gcc -c -g -O -Wa,-alh,-L file.c
@end smallexample

@noindent
This passes two options to the assembler: @samp{-alh} (emit a listing to
standard output with high-level and assembly source) and @samp{-L} (retain
local symbols in the symbol table).

Usually you do not need to use this @samp{-Wa} mechanism, since many compiler
command-line options are automatically passed to the assembler by the compiler.
(You can call the @sc{gnu} compiler driver with the @samp{-v} option to see
precisely what options it passes to each compilation pass, including the
assembler.)

@c man end

@menu
* a::             -a[cdghlns] enable listings
* alternate::     --alternate enable alternate macro syntax
* D::             -D for compatibility
* f::             -f to work faster
* I::             -I for .include search path
@ifclear DIFF-TBL-KLUGE
* K::             -K for compatibility
@end ifclear
@ifset DIFF-TBL-KLUGE
* K::             -K for difference tables
@end ifset

* L::             -L to retain local symbols
* listing::       --listing-XXX to configure listing output
* M::		  -M or --mri to assemble in MRI compatibility mode
* MD::            --MD for dependency tracking
* o::             -o to name the object file
* R::             -R to join data and text sections
* statistics::    --statistics to see statistics about assembly
* traditional-format:: --traditional-format for compatible output
* v::             -v to announce version
* W::             -W, --no-warn, --warn, --fatal-warnings to control warnings
* Z::             -Z to make object file even after errors
@end menu

@node a
@section Enable Listings: @option{-a[cdghlns]}

@kindex -a
@kindex -ac
@kindex -ad
@kindex -ag
@kindex -ah
@kindex -al
@kindex -an
@kindex -as
@cindex listings, enabling
@cindex assembly listings, enabling

These options enable listing output from the assembler.  By itself,
@samp{-a} requests high-level, assembly, and symbols listing.
You can use other letters to select specific options for the list:
@samp{-ah} requests a high-level language listing,
@samp{-al} requests an output-program assembly listing, and
@samp{-as} requests a symbol table listing.
High-level listings require that a compiler debugging option like
@samp{-g} be used, and that assembly listings (@samp{-al}) be requested
also.

Use the @samp{-ag} option to print a first section with general assembly
information, like @value{AS} version, switches passed, or time stamp.

Use the @samp{-ac} option to omit false conditionals from a listing.  Any lines
which are not assembled because of a false @code{.if} (or @code{.ifdef}, or any
other conditional), or a true @code{.if} followed by an @code{.else}, will be
omitted from the listing.

Use the @samp{-ad} option to omit debugging directives from the
listing.

Once you have specified one of these options, you can further control
listing output and its appearance using the directives @code{.list},
@code{.nolist}, @code{.psize}, @code{.eject}, @code{.title}, and
@code{.sbttl}.
The @samp{-an} option turns off all forms processing.
If you do not request listing output with one of the @samp{-a} options, the
listing-control directives have no effect.

The letters after @samp{-a} may be combined into one option,
@emph{e.g.}, @samp{-aln}.

Note if the assembler source is coming from the standard input (e.g.,
because it
is being created by @code{@value{GCC}} and the @samp{-pipe} command line switch
is being used) then the listing will not contain any comments or preprocessor
directives.  This is because the listing code buffers input source lines from
stdin only after they have been preprocessed by the assembler.  This reduces
memory usage and makes the code more efficient.

@node alternate
@section @option{--alternate}

@kindex --alternate
Begin in alternate macro mode, see @ref{Altmacro,,@code{.altmacro}}.

@node D
@section @option{-D}

@kindex -D
This option has no effect whatsoever, but it is accepted to make it more
likely that scripts written for other assemblers also work with
@command{@value{AS}}.

@node f
@section Work Faster: @option{-f}

@kindex -f
@cindex trusted compiler
@cindex faster processing (@option{-f})
@samp{-f} should only be used when assembling programs written by a
(trusted) compiler.  @samp{-f} stops the assembler from doing whitespace
and comment preprocessing on
the input file(s) before assembling them.  @xref{Preprocessing,
,Preprocessing}.

@quotation
@emph{Warning:} if you use @samp{-f} when the files actually need to be
preprocessed (if they contain comments, for example), @command{@value{AS}} does
not work correctly.
@end quotation

@node I
@section @code{.include} Search Path: @option{-I} @var{path}

@kindex -I @var{path}
@cindex paths for @code{.include}
@cindex search path for @code{.include}
@cindex @code{include} directive search path
Use this option to add a @var{path} to the list of directories
@command{@value{AS}} searches for files specified in @code{.include}
directives (@pxref{Include,,@code{.include}}).  You may use @option{-I} as
many times as necessary to include a variety of paths.  The current
working directory is always searched first; after that, @command{@value{AS}}
searches any @samp{-I} directories in the same order as they were
specified (left to right) on the command line.

@node K
@section Difference Tables: @option{-K}

@kindex -K
@ifclear DIFF-TBL-KLUGE
On the @value{TARGET} family, this option is allowed, but has no effect.  It is
permitted for compatibility with the @sc{gnu} assembler on other platforms,
where it can be used to warn when the assembler alters the machine code
generated for @samp{.word} directives in difference tables.  The @value{TARGET}
family does not have the addressing limitations that sometimes lead to this
alteration on other platforms.
@end ifclear

@ifset DIFF-TBL-KLUGE
@cindex difference tables, warning
@cindex warning for altered difference tables
@command{@value{AS}} sometimes alters the code emitted for directives of the
form @samp{.word @var{sym1}-@var{sym2}}.  @xref{Word,,@code{.word}}.
You can use the @samp{-K} option if you want a warning issued when this
is done.
@end ifset

@node L
@section Include Local Symbols: @option{-L}

@kindex -L
@cindex local symbols, retaining in output
Symbols beginning with system-specific local label prefixes, typically
@samp{.L} for ELF systems or @samp{L} for traditional a.out systems, are
called @dfn{local symbols}.  @xref{Symbol Names}.  Normally you do not see
such symbols when debugging, because they are intended for the use of
programs (like compilers) that compose assembler programs, not for your
notice.  Normally both @command{@value{AS}} and @code{@value{LD}} discard
such symbols, so you do not normally debug with them.

This option tells @command{@value{AS}} to retain those local symbols
in the object file.  Usually if you do this you also tell the linker
@code{@value{LD}} to preserve those symbols.

@node listing
@section Configuring listing output: @option{--listing}

The listing feature of the assembler can be enabled via the command line switch
@samp{-a} (@pxref{a}).  This feature combines the input source file(s) with a
hex dump of the corresponding locations in the output object file, and displays
them as a listing file.  The format of this listing can be controlled by
directives inside the assembler source (i.e., @code{.list} (@pxref{List}),
@code{.title} (@pxref{Title}), @code{.sbttl} (@pxref{Sbttl}),
@code{.psize} (@pxref{Psize}), and
@code{.eject} (@pxref{Eject}) and also by the following switches:

@table @gcctabopt
@item --listing-lhs-width=@samp{number}
@kindex --listing-lhs-width
@cindex Width of first line disassembly output
Sets the maximum width, in words, of the first line of the hex byte dump.  This
dump appears on the left hand side of the listing output.

@item --listing-lhs-width2=@samp{number}
@kindex --listing-lhs-width2
@cindex Width of continuation lines of disassembly output
Sets the maximum width, in words, of any further lines of the hex byte dump for
a given input source line.  If this value is not specified, it defaults to being
the same as the value specified for @samp{--listing-lhs-width}.  If neither
switch is used the default is to one.

@item --listing-rhs-width=@samp{number}
@kindex --listing-rhs-width
@cindex Width of source line output
Sets the maximum width, in characters, of the source line that is displayed
alongside the hex dump.  The default value for this parameter is 100.  The
source line is displayed on the right hand side of the listing output.

@item --listing-cont-lines=@samp{number}
@kindex --listing-cont-lines
@cindex Maximum number of continuation lines
Sets the maximum number of continuation lines of hex dump that will be
displayed for a given single line of source input.  The default value is 4.
@end table

@node M
@section Assemble in MRI Compatibility Mode: @option{-M}

@kindex -M
@cindex MRI compatibility mode
The @option{-M} or @option{--mri} option selects MRI compatibility mode.  This
changes the syntax and pseudo-op handling of @command{@value{AS}} to make it
compatible with the @code{ASM68K} or the @code{ASM960} (depending upon the
configured target) assembler from Microtec Research.  The exact nature of the
MRI syntax will not be documented here; see the MRI manuals for more
information.  Note in particular that the handling of macros and macro
arguments is somewhat different.  The purpose of this option is to permit
assembling existing MRI assembler code using @command{@value{AS}}.

The MRI compatibility is not complete.  Certain operations of the MRI assembler
depend upon its object file format, and can not be supported using other object
file formats.  Supporting these would require enhancing each object file format
individually.  These are:

@itemize @bullet
@item global symbols in common section

The m68k MRI assembler supports common sections which are merged by the linker.
Other object file formats do not support this.  @command{@value{AS}} handles
common sections by treating them as a single common symbol.  It permits local
symbols to be defined within a common section, but it can not support global
symbols, since it has no way to describe them.

@item complex relocations

The MRI assemblers support relocations against a negated section address, and
relocations which combine the start addresses of two or more sections.  These
are not support by other object file formats.

@item @code{END} pseudo-op specifying start address

The MRI @code{END} pseudo-op permits the specification of a start address.
This is not supported by other object file formats.  The start address may
instead be specified using the @option{-e} option to the linker, or in a linker
script.

@item @code{IDNT}, @code{.ident} and @code{NAME} pseudo-ops

The MRI @code{IDNT}, @code{.ident} and @code{NAME} pseudo-ops assign a module
name to the output file.  This is not supported by other object file formats.

@item @code{ORG} pseudo-op

The m68k MRI @code{ORG} pseudo-op begins an absolute section at a given
address.  This differs from the usual @command{@value{AS}} @code{.org} pseudo-op,
which changes the location within the current section.  Absolute sections are
not supported by other object file formats.  The address of a section may be
assigned within a linker script.
@end itemize

There are some other features of the MRI assembler which are not supported by
@command{@value{AS}}, typically either because they are difficult or because they
seem of little consequence.  Some of these may be supported in future releases.

@itemize @bullet

@item EBCDIC strings

EBCDIC strings are not supported.

@item packed binary coded decimal

Packed binary coded decimal is not supported.  This means that the @code{DC.P}
and @code{DCB.P} pseudo-ops are not supported.

@item @code{FEQU} pseudo-op

The m68k @code{FEQU} pseudo-op is not supported.

@item @code{NOOBJ} pseudo-op

The m68k @code{NOOBJ} pseudo-op is not supported.

@item @code{OPT} branch control options

The m68k @code{OPT} branch control options---@code{B}, @code{BRS}, @code{BRB},
@code{BRL}, and @code{BRW}---are ignored.  @command{@value{AS}} automatically
relaxes all branches, whether forward or backward, to an appropriate size, so
these options serve no purpose.

@item @code{OPT} list control options

The following m68k @code{OPT} list control options are ignored: @code{C},
@code{CEX}, @code{CL}, @code{CRE}, @code{E}, @code{G}, @code{I}, @code{M},
@code{MEX}, @code{MC}, @code{MD}, @code{X}.

@item other @code{OPT} options

The following m68k @code{OPT} options are ignored: @code{NEST}, @code{O},
@code{OLD}, @code{OP}, @code{P}, @code{PCO}, @code{PCR}, @code{PCS}, @code{R}.

@item @code{OPT} @code{D} option is default

The m68k @code{OPT} @code{D} option is the default, unlike the MRI assembler.
@code{OPT NOD} may be used to turn it off.

@item @code{XREF} pseudo-op.

The m68k @code{XREF} pseudo-op is ignored.

@item @code{.debug} pseudo-op

The i960 @code{.debug} pseudo-op is not supported.

@item @code{.extended} pseudo-op

The i960 @code{.extended} pseudo-op is not supported.

@item @code{.list} pseudo-op.

The various options of the i960 @code{.list} pseudo-op are not supported.

@item @code{.optimize} pseudo-op

The i960 @code{.optimize} pseudo-op is not supported.

@item @code{.output} pseudo-op

The i960 @code{.output} pseudo-op is not supported.

@item @code{.setreal} pseudo-op

The i960 @code{.setreal} pseudo-op is not supported.

@end itemize

@node MD
@section Dependency Tracking: @option{--MD}

@kindex --MD
@cindex dependency tracking
@cindex make rules

@command{@value{AS}} can generate a dependency file for the file it creates.  This
file consists of a single rule suitable for @code{make} describing the
dependencies of the main source file.

The rule is written to the file named in its argument.

This feature is used in the automatic updating of makefiles.

@node o
@section Name the Object File: @option{-o}

@kindex -o
@cindex naming object file
@cindex object file name
There is always one object file output when you run @command{@value{AS}}.  By
default it has the name
@ifset GENERIC
@ifset I960
@file{a.out} (or @file{b.out}, for Intel 960 targets only).
@end ifset
@ifclear I960
@file{a.out}.
@end ifclear
@end ifset
@ifclear GENERIC
@ifset I960
@file{b.out}.
@end ifset
@ifclear I960
@file{a.out}.
@end ifclear
@end ifclear
You use this option (which takes exactly one filename) to give the
object file a different name.

Whatever the object file is called, @command{@value{AS}} overwrites any
existing file of the same name.

@node R
@section Join Data and Text Sections: @option{-R}

@kindex -R
@cindex data and text sections, joining
@cindex text and data sections, joining
@cindex joining text and data sections
@cindex merging text and data sections
@option{-R} tells @command{@value{AS}} to write the object file as if all
data-section data lives in the text section.  This is only done at
the very last moment:  your binary data are the same, but data
section parts are relocated differently.  The data section part of
your object file is zero bytes long because all its bytes are
appended to the text section.  (@xref{Sections,,Sections and Relocation}.)

When you specify @option{-R} it would be possible to generate shorter
address displacements (because we do not have to cross between text and
data section).  We refrain from doing this simply for compatibility with
older versions of @command{@value{AS}}.  In future, @option{-R} may work this way.

@ifset COFF-ELF
When @command{@value{AS}} is configured for COFF or ELF output,
this option is only useful if you use sections named @samp{.text} and
@samp{.data}.
@end ifset

@ifset HPPA
@option{-R} is not supported for any of the HPPA targets.  Using
@option{-R} generates a warning from @command{@value{AS}}.
@end ifset

@node statistics
@section Display Assembly Statistics: @option{--statistics}

@kindex --statistics
@cindex statistics, about assembly
@cindex time, total for assembly
@cindex space used, maximum for assembly
Use @samp{--statistics} to display two statistics about the resources used by
@command{@value{AS}}: the maximum amount of space allocated during the assembly
(in bytes), and the total execution time taken for the assembly (in @sc{cpu}
seconds).

@node traditional-format
@section Compatible Output: @option{--traditional-format}

@kindex --traditional-format
For some targets, the output of @command{@value{AS}} is different in some ways
from the output of some existing assembler.  This switch requests
@command{@value{AS}} to use the traditional format instead.

For example, it disables the exception frame optimizations which
@command{@value{AS}} normally does by default on @code{@value{GCC}} output.

@node v
@section Announce Version: @option{-v}

@kindex -v
@kindex -version
@cindex assembler version
@cindex version of assembler
You can find out what version of as is running by including the
option @samp{-v} (which you can also spell as @samp{-version}) on the
command line.

@node W
@section Control Warnings: @option{-W}, @option{--warn}, @option{--no-warn}, @option{--fatal-warnings}

@command{@value{AS}} should never give a warning or error message when
assembling compiler output.  But programs written by people often
cause @command{@value{AS}} to give a warning that a particular assumption was
made.  All such warnings are directed to the standard error file.

@kindex -W
@kindex --no-warn
@cindex suppressing warnings
@cindex warnings, suppressing
If you use the @option{-W} and @option{--no-warn} options, no warnings are issued.
This only affects the warning messages: it does not change any particular of
how @command{@value{AS}} assembles your file.  Errors, which stop the assembly,
are still reported.

@kindex --fatal-warnings
@cindex errors, caused by warnings
@cindex warnings, causing error
If you use the @option{--fatal-warnings} option, @command{@value{AS}} considers
files that generate warnings to be in error.

@kindex --warn
@cindex warnings, switching on
You can switch these options off again by specifying @option{--warn}, which
causes warnings to be output as usual.

@node Z
@section Generate Object File in Spite of Errors: @option{-Z}
@cindex object file, after errors
@cindex errors, continuing after
After an error message, @command{@value{AS}} normally produces no output.  If for
some reason you are interested in object file output even after
@command{@value{AS}} gives an error message on your program, use the @samp{-Z}
option.  If there are any errors, @command{@value{AS}} continues anyways, and
writes an object file after a final warning message of the form @samp{@var{n}
errors, @var{m} warnings, generating bad object file.}

@node Syntax
@chapter Syntax

@cindex machine-independent syntax
@cindex syntax, machine-independent
This chapter describes the machine-independent syntax allowed in a
source file.  @command{@value{AS}} syntax is similar to what many other
assemblers use; it is inspired by the BSD 4.2
@ifclear VAX
assembler.
@end ifclear
@ifset VAX
assembler, except that @command{@value{AS}} does not assemble Vax bit-fields.
@end ifset

@menu
* Preprocessing::              Preprocessing
* Whitespace::                  Whitespace
* Comments::                    Comments
* Symbol Intro::                Symbols
* Statements::                  Statements
* Constants::                   Constants
@end menu

@node Preprocessing
@section Preprocessing

@cindex preprocessing
The @command{@value{AS}} internal preprocessor:
@itemize @bullet
@cindex whitespace, removed by preprocessor
@item
adjusts and removes extra whitespace.  It leaves one space or tab before
the keywords on a line, and turns any other whitespace on the line into
a single space.

@cindex comments, removed by preprocessor
@item
removes all comments, replacing them with a single space, or an
appropriate number of newlines.

@cindex constants, converted by preprocessor
@item
converts character constants into the appropriate numeric values.
@end itemize

It does not do macro processing, include file handling, or
anything else you may get from your C compiler's preprocessor.  You can
do include file processing with the @code{.include} directive
(@pxref{Include,,@code{.include}}).  You can use the @sc{gnu} C compiler driver
to get other ``CPP'' style preprocessing by giving the input file a
@samp{.S} suffix.  @xref{Overall Options, ,Options Controlling the Kind of
Output, gcc.info, Using GNU CC}.

Excess whitespace, comments, and character constants
cannot be used in the portions of the input text that are not
preprocessed.

@cindex turning preprocessing on and off
@cindex preprocessing, turning on and off
@kindex #NO_APP
@kindex #APP
If the first line of an input file is @code{#NO_APP} or if you use the
@samp{-f} option, whitespace and comments are not removed from the input file.
Within an input file, you can ask for whitespace and comment removal in
specific portions of the by putting a line that says @code{#APP} before the
text that may contain whitespace or comments, and putting a line that says
@code{#NO_APP} after this text.  This feature is mainly intend to support
@code{asm} statements in compilers whose output is otherwise free of comments
and whitespace.

@node Whitespace
@section Whitespace

@cindex whitespace
@dfn{Whitespace} is one or more blanks or tabs, in any order.
Whitespace is used to separate symbols, and to make programs neater for
people to read.  Unless within character constants
(@pxref{Characters,,Character Constants}), any whitespace means the same
as exactly one space.

@node Comments
@section Comments

@cindex comments
There are two ways of rendering comments to @command{@value{AS}}.  In both
cases the comment is equivalent to one space.

Anything from @samp{/*} through the next @samp{*/} is a comment.
This means you may not nest these comments.

@smallexample
/*
  The only way to include a newline ('\n') in a comment
  is to use this sort of comment.
*/

/* This sort of comment does not nest. */
@end smallexample

@cindex line comment character
Anything from the @dfn{line comment} character to the next newline
is considered a comment and is ignored.  The line comment character is
@ifset ARC
@samp{;} on the ARC;
@end ifset
@ifset ARM
@samp{@@} on the ARM;
@end ifset
@ifset H8/300
@samp{;} for the H8/300 family;
@end ifset
@ifset HPPA
@samp{;} for the HPPA;
@end ifset
@ifset I80386
@samp{#} on the i386 and x86-64;
@end ifset
@ifset I960
@samp{#} on the i960;
@end ifset
@ifset PDP11
@samp{;} for the PDP-11;
@end ifset
@ifset PJ
@samp{;} for picoJava;
@end ifset
@ifset PPC
@samp{#} for Motorola PowerPC;
@end ifset
@ifset S390
@samp{#} for IBM S/390;
@end ifset
@ifset SCORE
@samp{#} for the Sunplus SCORE;
@end ifset
@ifset SH
@samp{!} for the Renesas / SuperH SH;
@end ifset
@ifset SPARC
@samp{!} on the SPARC;
@end ifset
@ifset IP2K
@samp{#} on the ip2k;
@end ifset
@ifset M32C
@samp{#} on the m32c;
@end ifset
@ifset M32R
@samp{#} on the m32r;
@end ifset
@ifset M680X0
@samp{|} on the 680x0;
@end ifset
@ifset M68HC11
@samp{#} on the 68HC11 and 68HC12;
@end ifset
@ifset VAX
@samp{#} on the Vax;
@end ifset
@ifset Z80
@samp{;} for the Z80;
@end ifset
@ifset Z8000
@samp{!} for the Z8000;
@end ifset
@ifset V850
@samp{#} on the V850;
@end ifset
@ifset XTENSA
@samp{#} for Xtensa systems;
@end ifset
see @ref{Machine Dependencies}.  @refill
@c FIXME What about i860?

@ifset GENERIC
On some machines there are two different line comment characters.  One
character only begins a comment if it is the first non-whitespace character on
a line, while the other always begins a comment.
@end ifset

@ifset V850
The V850 assembler also supports a double dash as starting a comment that
extends to the end of the line.

@samp{--};
@end ifset

@kindex #
@cindex lines starting with @code{#}
@cindex logical line numbers
To be compatible with past assemblers, lines that begin with @samp{#} have a
special interpretation.  Following the @samp{#} should be an absolute
expression (@pxref{Expressions}): the logical line number of the @emph{next}
line.  Then a string (@pxref{Strings, ,Strings}) is allowed: if present it is a
new logical file name.  The rest of the line, if any, should be whitespace.

If the first non-whitespace characters on the line are not numeric,
the line is ignored.  (Just like a comment.)

@smallexample
                          # This is an ordinary comment.
# 42-6 "new_file_name"    # New logical file name
                          # This is logical line # 36.
@end smallexample
This feature is deprecated, and may disappear from future versions
of @command{@value{AS}}.

@node Symbol Intro
@section Symbols

@cindex characters used in symbols
@ifclear SPECIAL-SYMS
A @dfn{symbol} is one or more characters chosen from the set of all
letters (both upper and lower case), digits and the three characters
@samp{_.$}.
@end ifclear
@ifset SPECIAL-SYMS
@ifclear GENERIC
@ifset H8
A @dfn{symbol} is one or more characters chosen from the set of all
letters (both upper and lower case), digits and the three characters
@samp{._$}.  (Save that, on the H8/300 only, you may not use @samp{$} in
symbol names.)
@end ifset
@end ifclear
@end ifset
@ifset GENERIC
On most machines, you can also use @code{$} in symbol names; exceptions
are noted in @ref{Machine Dependencies}.
@end ifset
No symbol may begin with a digit.  Case is significant.
There is no length limit: all characters are significant.  Symbols are
delimited by characters not in that set, or by the beginning of a file
(since the source program must end with a newline, the end of a file is
not a possible symbol delimiter).  @xref{Symbols}.
@cindex length of symbols

@node Statements
@section Statements

@cindex statements, structure of
@cindex line separator character
@cindex statement separator character
@ifclear GENERIC
@ifclear abnormal-separator
A @dfn{statement} ends at a newline character (@samp{\n}) or at a
semicolon (@samp{;}).  The newline or semicolon is considered part of
the preceding statement.  Newlines and semicolons within character
constants are an exception: they do not end statements.
@end ifclear
@ifset abnormal-separator
@ifset HPPA
A @dfn{statement} ends at a newline character (@samp{\n}) or an exclamation 
point (@samp{!}).  The newline or exclamation point is considered part of the
preceding statement.  Newlines and exclamation points within character
constants are an exception: they do not end statements.
@end ifset
@ifset H8
A @dfn{statement} ends at a newline character (@samp{\n}); or (for the
H8/300) a dollar sign (@samp{$}); or (for the Renesas-SH) a semicolon
(@samp{;}).  The newline or separator character is considered part of
the preceding statement.  Newlines and separators within character
constants are an exception: they do not end statements.
@end ifset
@end ifset
@end ifclear
@ifset GENERIC
A @dfn{statement} ends at a newline character (@samp{\n}) or line
separator character.  (The line separator is usually @samp{;}, unless this
conflicts with the comment character; see @ref{Machine Dependencies}.)  The
newline or separator character is considered part of the preceding
statement.  Newlines and separators within character constants are an
exception: they do not end statements.
@end ifset

@cindex newline, required at file end
@cindex EOF, newline must precede
It is an error to end any statement with end-of-file:  the last
character of any input file should be a newline.@refill

An empty statement is allowed, and may include whitespace.  It is ignored.

@cindex instructions and directives
@cindex directives and instructions
@c "key symbol" is not used elsewhere in the document; seems pedantic to
@c @defn{} it in that case, as was done previously...  doc@cygnus.com,
@c 13feb91.
A statement begins with zero or more labels, optionally followed by a
key symbol which determines what kind of statement it is.  The key
symbol determines the syntax of the rest of the statement.  If the
symbol begins with a dot @samp{.} then the statement is an assembler
directive: typically valid for any computer.  If the symbol begins with
a letter the statement is an assembly language @dfn{instruction}: it
assembles into a machine language instruction.
@ifset GENERIC
Different versions of @command{@value{AS}} for different computers
recognize different instructions.  In fact, the same symbol may
represent a different instruction in a different computer's assembly
language.@refill
@end ifset

@cindex @code{:} (label)
@cindex label (@code{:})
A label is a symbol immediately followed by a colon (@code{:}).
Whitespace before a label or after a colon is permitted, but you may not
have whitespace between a label's symbol and its colon. @xref{Labels}.

@ifset HPPA
For HPPA targets, labels need not be immediately followed by a colon, but 
the definition of a label must begin in column zero.  This also implies that
only one label may be defined on each line.
@end ifset

@smallexample
label:     .directive    followed by something
another_label:           # This is an empty statement.
           instruction   operand_1, operand_2, @dots{}
@end smallexample

@node Constants
@section Constants

@cindex constants
A constant is a number, written so that its value is known by
inspection, without knowing any context.  Like this:
@smallexample
@group
.byte  74, 0112, 092, 0x4A, 0X4a, 'J, '\J # All the same value.
.ascii "Ring the bell\7"                  # A string constant.
.octa  0x123456789abcdef0123456789ABCDEF0 # A bignum.
.float 0f-314159265358979323846264338327\
95028841971.693993751E-40                 # - pi, a flonum.
@end group
@end smallexample

@menu
* Characters::                  Character Constants
* Numbers::                     Number Constants
@end menu

@node Characters
@subsection Character Constants

@cindex character constants
@cindex constants, character
There are two kinds of character constants.  A @dfn{character} stands
for one character in one byte and its value may be used in
numeric expressions.  String constants (properly called string
@emph{literals}) are potentially many bytes and their values may not be
used in arithmetic expressions.

@menu
* Strings::                     Strings
* Chars::                       Characters
@end menu

@node Strings
@subsubsection Strings

@cindex string constants
@cindex constants, string
A @dfn{string} is written between double-quotes.  It may contain
double-quotes or null characters.  The way to get special characters
into a string is to @dfn{escape} these characters: precede them with
a backslash @samp{\} character.  For example @samp{\\} represents
one backslash:  the first @code{\} is an escape which tells
@command{@value{AS}} to interpret the second character literally as a backslash
(which prevents @command{@value{AS}} from recognizing the second @code{\} as an
escape character).  The complete list of escapes follows.

@cindex escape codes, character
@cindex character escape codes
@table @kbd
@c      @item \a
@c      Mnemonic for ACKnowledge; for ASCII this is octal code 007.
@c
@cindex @code{\b} (backspace character)
@cindex backspace (@code{\b})
@item \b
Mnemonic for backspace; for ASCII this is octal code 010.

@c      @item \e
@c      Mnemonic for EOText; for ASCII this is octal code 004.
@c
@cindex @code{\f} (formfeed character)
@cindex formfeed (@code{\f})
@item \f
Mnemonic for FormFeed; for ASCII this is octal code 014.

@cindex @code{\n} (newline character)
@cindex newline (@code{\n})
@item \n
Mnemonic for newline; for ASCII this is octal code 012.

@c      @item \p
@c      Mnemonic for prefix; for ASCII this is octal code 033, usually known as @code{escape}.
@c
@cindex @code{\r} (carriage return character)
@cindex carriage return (@code{\r})
@item \r
Mnemonic for carriage-Return; for ASCII this is octal code 015.

@c      @item \s
@c      Mnemonic for space; for ASCII this is octal code 040.  Included for compliance with
@c      other assemblers.
@c
@cindex @code{\t} (tab)
@cindex tab (@code{\t})
@item \t
Mnemonic for horizontal Tab; for ASCII this is octal code 011.

@c      @item \v
@c      Mnemonic for Vertical tab; for ASCII this is octal code 013.
@c      @item \x @var{digit} @var{digit} @var{digit}
@c      A hexadecimal character code.  The numeric code is 3 hexadecimal digits.
@c
@cindex @code{\@var{ddd}} (octal character code)
@cindex octal character code (@code{\@var{ddd}})
@item \ @var{digit} @var{digit} @var{digit}
An octal character code.  The numeric code is 3 octal digits.
For compatibility with other Unix systems, 8 and 9 are accepted as digits:
for example, @code{\008} has the value 010, and @code{\009} the value 011.

@cindex @code{\@var{xd...}} (hex character code)
@cindex hex character code (@code{\@var{xd...}})
@item \@code{x} @var{hex-digits...}
A hex character code.  All trailing hex digits are combined.  Either upper or
lower case @code{x} works.

@cindex @code{\\} (@samp{\} character)
@cindex backslash (@code{\\})
@item \\
Represents one @samp{\} character.

@c      @item \'
@c      Represents one @samp{'} (accent acute) character.
@c      This is needed in single character literals
@c      (@xref{Characters,,Character Constants}.) to represent
@c      a @samp{'}.
@c
@cindex @code{\"} (doublequote character)
@cindex doublequote (@code{\"})
@item \"
Represents one @samp{"} character.  Needed in strings to represent
this character, because an unescaped @samp{"} would end the string.

@item \ @var{anything-else}
Any other character when escaped by @kbd{\} gives a warning, but
assembles as if the @samp{\} was not present.  The idea is that if
you used an escape sequence you clearly didn't want the literal
interpretation of the following character.  However @command{@value{AS}} has no
other interpretation, so @command{@value{AS}} knows it is giving you the wrong
code and warns you of the fact.
@end table

Which characters are escapable, and what those escapes represent,
varies widely among assemblers.  The current set is what we think
the BSD 4.2 assembler recognizes, and is a subset of what most C
compilers recognize.  If you are in doubt, do not use an escape
sequence.

@node Chars
@subsubsection Characters

@cindex single character constant
@cindex character, single
@cindex constant, single character
A single character may be written as a single quote immediately
followed by that character.  The same escapes apply to characters as
to strings.  So if you want to write the character backslash, you
must write @kbd{'\\} where the first @code{\} escapes the second
@code{\}.  As you can see, the quote is an acute accent, not a
grave accent.  A newline
@ifclear GENERIC
@ifclear abnormal-separator
(or semicolon @samp{;})
@end ifclear
@ifset abnormal-separator
@ifset H8
(or dollar sign @samp{$}, for the H8/300; or semicolon @samp{;} for the
Renesas SH)
@end ifset
@end ifset
@end ifclear
immediately following an acute accent is taken as a literal character
and does not count as the end of a statement.  The value of a character
constant in a numeric expression is the machine's byte-wide code for
that character.  @command{@value{AS}} assumes your character code is ASCII:
@kbd{'A} means 65, @kbd{'B} means 66, and so on. @refill

@node Numbers
@subsection Number Constants

@cindex constants, number
@cindex number constants
@command{@value{AS}} distinguishes three kinds of numbers according to how they
are stored in the target machine.  @emph{Integers} are numbers that
would fit into an @code{int} in the C language.  @emph{Bignums} are
integers, but they are stored in more than 32 bits.  @emph{Flonums}
are floating point numbers, described below.

@menu
* Integers::                    Integers
* Bignums::                     Bignums
* Flonums::                     Flonums
@ifclear GENERIC
@ifset I960
* Bit Fields::                  Bit Fields
@end ifset
@end ifclear
@end menu

@node Integers
@subsubsection Integers
@cindex integers
@cindex constants, integer

@cindex binary integers
@cindex integers, binary
A binary integer is @samp{0b} or @samp{0B} followed by zero or more of
the binary digits @samp{01}.

@cindex octal integers
@cindex integers, octal
An octal integer is @samp{0} followed by zero or more of the octal
digits (@samp{01234567}).

@cindex decimal integers
@cindex integers, decimal
A decimal integer starts with a non-zero digit followed by zero or
more digits (@samp{0123456789}).

@cindex hexadecimal integers
@cindex integers, hexadecimal
A hexadecimal integer is @samp{0x} or @samp{0X} followed by one or
more hexadecimal digits chosen from @samp{0123456789abcdefABCDEF}.

Integers have the usual values.  To denote a negative integer, use
the prefix operator @samp{-} discussed under expressions
(@pxref{Prefix Ops,,Prefix Operators}).

@node Bignums
@subsubsection Bignums

@cindex bignums
@cindex constants, bignum
A @dfn{bignum} has the same syntax and semantics as an integer
except that the number (or its negative) takes more than 32 bits to
represent in binary.  The distinction is made because in some places
integers are permitted while bignums are not.

@node Flonums
@subsubsection Flonums
@cindex flonums
@cindex floating point numbers
@cindex constants, floating point

@cindex precision, floating point
A @dfn{flonum} represents a floating point number.  The translation is
indirect: a decimal floating point number from the text is converted by
@command{@value{AS}} to a generic binary floating point number of more than
sufficient precision.  This generic floating point number is converted
to a particular computer's floating point format (or formats) by a
portion of @command{@value{AS}} specialized to that computer.

A flonum is written by writing (in order)
@itemize @bullet
@item
The digit @samp{0}.
@ifset HPPA
(@samp{0} is optional on the HPPA.)
@end ifset

@item
A letter, to tell @command{@value{AS}} the rest of the number is a flonum.
@ifset GENERIC
@kbd{e} is recommended.  Case is not important.
@ignore
@c FIXME: verify if flonum syntax really this vague for most cases
(Any otherwise illegal letter works here, but that might be changed.  Vax BSD
4.2 assembler seems to allow any of @samp{defghDEFGH}.)
@end ignore

On the H8/300, Renesas / SuperH SH,
and AMD 29K architectures, the letter must be
one of the letters @samp{DFPRSX} (in upper or lower case).

On the ARC, the letter must be one of the letters @samp{DFRS}
(in upper or lower case).

On the Intel 960 architecture, the letter must be
one of the letters @samp{DFT} (in upper or lower case).

On the HPPA architecture, the letter must be @samp{E} (upper case only).
@end ifset
@ifclear GENERIC
@ifset ARC
One of the letters @samp{DFRS} (in upper or lower case).
@end ifset
@ifset H8
One of the letters @samp{DFPRSX} (in upper or lower case).
@end ifset
@ifset HPPA
The letter @samp{E} (upper case only).
@end ifset
@ifset I960
One of the letters @samp{DFT} (in upper or lower case).
@end ifset
@end ifclear

@item
An optional sign: either @samp{+} or @samp{-}.

@item
An optional @dfn{integer part}: zero or more decimal digits.

@item
An optional @dfn{fractional part}: @samp{.} followed by zero
or more decimal digits.

@item
An optional exponent, consisting of:

@itemize @bullet
@item
An @samp{E} or @samp{e}.
@c I can't find a config where "EXP_CHARS" is other than 'eE', but in
@c principle this can perfectly well be different on different targets.
@item
Optional sign: either @samp{+} or @samp{-}.
@item
One or more decimal digits.
@end itemize

@end itemize

At least one of the integer part or the fractional part must be
present.  The floating point number has the usual base-10 value.

@command{@value{AS}} does all processing using integers.  Flonums are computed
independently of any floating point hardware in the computer running
@command{@value{AS}}.

@ifclear GENERIC
@ifset I960
@c Bit fields are written as a general facility but are also controlled
@c by a conditional-compilation flag---which is as of now (21mar91)
@c turned on only by the i960 config of GAS.
@node Bit Fields
@subsubsection Bit Fields

@cindex bit fields
@cindex constants, bit field
You can also define numeric constants as @dfn{bit fields}.
Specify two numbers separated by a colon---
@example
@var{mask}:@var{value}
@end example
@noindent
@command{@value{AS}} applies a bitwise @sc{and} between @var{mask} and
@var{value}.

The resulting number is then packed
@ifset GENERIC
@c this conditional paren in case bit fields turned on elsewhere than 960
(in host-dependent byte order)
@end ifset
into a field whose width depends on which assembler directive has the
bit-field as its argument.  Overflow (a result from the bitwise and
requiring more binary digits to represent) is not an error; instead,
more constants are generated, of the specified width, beginning with the
least significant digits.@refill

The directives @code{.byte}, @code{.hword}, @code{.int}, @code{.long},
@code{.short}, and @code{.word} accept bit-field arguments.
@end ifset
@end ifclear

@node Sections
@chapter Sections and Relocation
@cindex sections
@cindex relocation

@menu
* Secs Background::             Background
* Ld Sections::                 Linker Sections
* As Sections::                 Assembler Internal Sections
* Sub-Sections::                Sub-Sections
* bss::                         bss Section
@end menu

@node Secs Background
@section Background

Roughly, a section is a range of addresses, with no gaps; all data
``in'' those addresses is treated the same for some particular purpose.
For example there may be a ``read only'' section.

@cindex linker, and assembler
@cindex assembler, and linker
The linker @code{@value{LD}} reads many object files (partial programs) and
combines their contents to form a runnable program.  When @command{@value{AS}}
emits an object file, the partial program is assumed to start at address 0.
@code{@value{LD}} assigns the final addresses for the partial program, so that
different partial programs do not overlap.  This is actually an
oversimplification, but it suffices to explain how @command{@value{AS}} uses
sections.

@code{@value{LD}} moves blocks of bytes of your program to their run-time
addresses.  These blocks slide to their run-time addresses as rigid
units; their length does not change and neither does the order of bytes
within them.  Such a rigid unit is called a @emph{section}.  Assigning
run-time addresses to sections is called @dfn{relocation}.  It includes
the task of adjusting mentions of object-file addresses so they refer to
the proper run-time addresses.
@ifset H8
For the H8/300, and for the Renesas / SuperH SH,
@command{@value{AS}} pads sections if needed to
ensure they end on a word (sixteen bit) boundary.
@end ifset

@cindex standard assembler sections
An object file written by @command{@value{AS}} has at least three sections, any
of which may be empty.  These are named @dfn{text}, @dfn{data} and
@dfn{bss} sections.

@ifset COFF-ELF
@ifset GENERIC
When it generates COFF or ELF output,
@end ifset
@command{@value{AS}} can also generate whatever other named sections you specify
using the @samp{.section} directive (@pxref{Section,,@code{.section}}).
If you do not use any directives that place output in the @samp{.text}
or @samp{.data} sections, these sections still exist, but are empty.
@end ifset

@ifset HPPA
@ifset GENERIC
When @command{@value{AS}} generates SOM or ELF output for the HPPA,
@end ifset
@command{@value{AS}} can also generate whatever other named sections you
specify using the @samp{.space} and @samp{.subspace} directives.  See
@cite{HP9000 Series 800 Assembly Language Reference Manual}
(HP 92432-90001) for details on the @samp{.space} and @samp{.subspace}
assembler directives.

@ifset SOM
Additionally, @command{@value{AS}} uses different names for the standard
text, data, and bss sections when generating SOM output.  Program text
is placed into the @samp{$CODE$} section, data into @samp{$DATA$}, and
BSS into @samp{$BSS$}.
@end ifset
@end ifset

Within the object file, the text section starts at address @code{0}, the
data section follows, and the bss section follows the data section.

@ifset HPPA
When generating either SOM or ELF output files on the HPPA, the text
section starts at address @code{0}, the data section at address
@code{0x4000000}, and the bss section follows the data section.
@end ifset

To let @code{@value{LD}} know which data changes when the sections are
relocated, and how to change that data, @command{@value{AS}} also writes to the
object file details of the relocation needed.  To perform relocation
@code{@value{LD}} must know, each time an address in the object
file is mentioned:
@itemize @bullet
@item
Where in the object file is the beginning of this reference to
an address?
@item
How long (in bytes) is this reference?
@item
Which section does the address refer to?  What is the numeric value of
@display
(@var{address}) @minus{} (@var{start-address of section})?
@end display
@item
Is the reference to an address ``Program-Counter relative''?
@end itemize

@cindex addresses, format of
@cindex section-relative addressing
In fact, every address @command{@value{AS}} ever uses is expressed as
@display
(@var{section}) + (@var{offset into section})
@end display
@noindent
Further, most expressions @command{@value{AS}} computes have this section-relative
nature.
@ifset SOM
(For some object formats, such as SOM for the HPPA, some expressions are
symbol-relative instead.)
@end ifset

In this manual we use the notation @{@var{secname} @var{N}@} to mean ``offset
@var{N} into section @var{secname}.''

Apart from text, data and bss sections you need to know about the
@dfn{absolute} section.  When @code{@value{LD}} mixes partial programs,
addresses in the absolute section remain unchanged.  For example, address
@code{@{absolute 0@}} is ``relocated'' to run-time address 0 by
@code{@value{LD}}.  Although the linker never arranges two partial programs'
data sections with overlapping addresses after linking, @emph{by definition}
their absolute sections must overlap.  Address @code{@{absolute@ 239@}} in one
part of a program is always the same address when the program is running as
address @code{@{absolute@ 239@}} in any other part of the program.

The idea of sections is extended to the @dfn{undefined} section.  Any
address whose section is unknown at assembly time is by definition
rendered @{undefined @var{U}@}---where @var{U} is filled in later.
Since numbers are always defined, the only way to generate an undefined
address is to mention an undefined symbol.  A reference to a named
common block would be such a symbol: its value is unknown at assembly
time so it has section @emph{undefined}.

By analogy the word @emph{section} is used to describe groups of sections in
the linked program.  @code{@value{LD}} puts all partial programs' text
sections in contiguous addresses in the linked program.  It is
customary to refer to the @emph{text section} of a program, meaning all
the addresses of all partial programs' text sections.  Likewise for
data and bss sections.

Some sections are manipulated by @code{@value{LD}}; others are invented for
use of @command{@value{AS}} and have no meaning except during assembly.

@node Ld Sections
@section Linker Sections
@code{@value{LD}} deals with just four kinds of sections, summarized below.

@table @strong

@ifset COFF-ELF
@cindex named sections
@cindex sections, named
@item named sections
@end ifset
@ifset aout-bout
@cindex text section
@cindex data section
@itemx text section
@itemx data section
@end ifset
These sections hold your program.  @command{@value{AS}} and @code{@value{LD}} treat them as
separate but equal sections.  Anything you can say of one section is
true of another.
@c @ifset aout-bout
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.
@c @end ifset

@cindex bss section
@item bss section
This section contains zeroed bytes when your program begins running.  It
is used to hold uninitialized 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.

@cindex absolute section
@item 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 @code{@value{LD}} must
not change when relocating.  In this sense we speak of absolute
addresses being ``unrelocatable'': they do not change during relocation.

@cindex undefined section
@item undefined section
This ``section'' is a catch-all for address references to objects not in
the preceding sections.
@c FIXME: ref to some other doc on obj-file formats could go here.
@end table

@cindex relocation example
An idealized example of three relocatable sections follows.
@ifset COFF-ELF
The example uses the traditional section names @samp{.text} and @samp{.data}.
@end ifset
Memory addresses are on the horizontal axis.

@c TEXI2ROFF-KILL
@ifnottex
@c END TEXI2ROFF-KILL
@smallexample
                      +-----+----+--+
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 @dots{}
@end smallexample
@c TEXI2ROFF-KILL
@end ifnottex
@need 5000
@tex
\bigskip
\line{\it Partial program \#1: \hfil}
\line{\ibox{2.5cm}{\tt text}\ibox{2cm}{\tt data}\ibox{1cm}{\tt bss}\hfil}
\line{\boxit{2.5cm}{\tt ttttt}\boxit{2cm}{\tt dddd}\boxit{1cm}{\tt 00}\hfil}

\line{\it Partial program \#2: \hfil}
\line{\ibox{1cm}{\tt text}\ibox{1.5cm}{\tt data}\ibox{1cm}{\tt bss}\hfil}
\line{\boxit{1cm}{\tt TTT}\boxit{1.5cm}{\tt DDDD}\boxit{1cm}{\tt 000}\hfil}

\line{\it linked program: \hfil}
\line{\ibox{.5cm}{}\ibox{1cm}{\tt text}\ibox{2.5cm}{}\ibox{.75cm}{}\ibox{2cm}{\tt data}\ibox{1.5cm}{}\ibox{2cm}{\tt bss}\hfil}
\line{\boxit{.5cm}{}\boxit{1cm}{\tt TTT}\boxit{2.5cm}{\tt
ttttt}\boxit{.75cm}{}\boxit{2cm}{\tt dddd}\boxit{1.5cm}{\tt
DDDD}\boxit{2cm}{\tt 00000}\ \dots\hfil}

\line{\it addresses: \hfil}
\line{0\dots\hfil}

@end tex
@c END TEXI2ROFF-KILL

@node As Sections
@section Assembler Internal Sections

@cindex internal assembler sections
@cindex sections in messages, internal
These sections are meant only for the internal use of @command{@value{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 @command{@value{AS}}
warning messages, so it might be helpful to have an idea of their
meanings to @command{@value{AS}}.  These sections are used to permit the
value of every expression in your assembly language program to be a
section-relative address.

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

@cindex expr (internal section)
@item 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.
@c FIXME item debug
@c FIXME item transfer[t] vector preload
@c FIXME item transfer[t] vector postload
@c FIXME item register
@end table

@node Sub-Sections
@section Sub-Sections

@cindex numbered subsections
@cindex grouping data
@ifset aout-bout
Assembled bytes
@ifset COFF-ELF
conventionally
@end ifset
fall into two sections: text and data.
@end ifset
You may have separate groups of
@ifset GENERIC
data in named sections
@end ifset
@ifclear GENERIC
@ifclear aout-bout
data in named sections
@end ifclear
@ifset aout-bout
text or data
@end ifset
@end ifclear
that you want to end up near to each other in the object file, even though they
are not contiguous in the assembler source.  @command{@value{AS}} allows you to
use @dfn{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 @samp{.text 0} before each
section of code being output, and a @samp{.text 1} before each group of
constants being output.

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

@ifset GENERIC
Each subsection is zero-padded up to a multiple of four bytes.
(Subsections may be padded a different amount on different flavors
of @command{@value{AS}}.)
@end ifset
@ifclear GENERIC
@ifset H8
On the H8/300 platform, each subsection is zero-padded to a word
boundary (two bytes).
The same is true on the Renesas SH.
@end ifset
@ifset I960
@c FIXME section padding (alignment)?
@c Rich Pixley says padding here depends on target obj code format; that
@c doesn't seem particularly useful to say without further elaboration,
@c so for now I say nothing about it.  If this is a generic BFD issue,
@c these paragraphs might need to vanish from this manual, and be
@c discussed in BFD chapter of binutils (or some such).
@end ifset
@end ifclear

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; @code{@value{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 @samp{.text
@var{expression}} or a @samp{.data @var{expression}} statement.
@ifset COFF
@ifset GENERIC
When generating COFF output, you
@end ifset
@ifclear GENERIC
You
@end ifclear
can also use an extra subsection
argument with arbitrary named sections: @samp{.section @var{name},
@var{expression}}.
@end ifset
@ifset ELF
@ifset GENERIC
When generating ELF output, you
@end ifset
@ifclear GENERIC
You
@end ifclear
can also use the @code{.subsection} directive (@pxref{SubSection})
to specify a subsection: @samp{.subsection @var{expression}}.
@end ifset
@var{Expression} should be an absolute expression
(@pxref{Expressions}).  If you just say @samp{.text} then @samp{.text 0}
is assumed.  Likewise @samp{.data} means @samp{.data 0}.  Assembly
begins in @code{text 0}.  For instance:
@smallexample
.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 (*)."
@end smallexample

Each section has a @dfn{location counter} incremented by one for every byte
assembled into that section.  Because subsections are merely a convenience
restricted to @command{@value{AS}} there is no concept of a subsection location
counter.  There is no way to directly manipulate a location counter---but the
@code{.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 @dfn{active} location counter.

@node bss
@section bss Section

@cindex bss section
@cindex common variable storage
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 @code{.lcomm} pseudo-op defines a symbol in the bss section; see
@ref{Lcomm,,@code{.lcomm}}.

The @code{.comm} pseudo-op may be used to declare a common symbol, which is
another form of uninitialized symbol; see @ref{Comm,,@code{.comm}}.

@ifset GENERIC
When assembling for a target which supports multiple sections, such as ELF or
COFF, you may switch into the @code{.bss} section and define symbols as usual;
see @ref{Section,,@code{.section}}.  You may only assemble zero values into the
section.  Typically the section will only contain symbol definitions and
@code{.skip} directives (@pxref{Skip,,@code{.skip}}).
@end ifset

@node Symbols
@chapter Symbols

@cindex 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.

@quotation
@cindex debuggers, and symbol order
@emph{Warning:} @command{@value{AS}} does not place symbols in the object file in
the same order they were declared.  This may break some debuggers.
@end quotation

@menu
* Labels::                      Labels
* Setting Symbols::             Giving Symbols Other Values
* Symbol Names::                Symbol Names
* Dot::                         The Special Dot Symbol
* Symbol Attributes::           Symbol Attributes
@end menu

@node Labels
@section Labels

@cindex labels
A @dfn{label} is written as a symbol immediately followed by a colon
@samp{:}.  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.

@ifset HPPA
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 @command{@value{AS}} also
provides a special directive @code{.label} for defining labels more flexibly.
@end ifset

@node Setting Symbols
@section Giving Symbols Other Values

@cindex assigning values to symbols
@cindex symbol values, assigning
A symbol can be given an arbitrary value by writing a symbol, followed
by an equals sign @samp{=}, followed by an expression
(@pxref{Expressions}).  This is equivalent to using the @code{.set}
directive.  @xref{Set,,@code{.set}}.  In the same way, using a double
equals sign @samp{=}@samp{=} here represents an equivalent of the
@code{.eqv} directive.  @xref{Eqv,,@code{.eqv}}.

@node Symbol Names
@section Symbol Names

@cindex symbol names
@cindex names, symbol
@ifclear SPECIAL-SYMS
Symbol names begin with a letter or with one of @samp{._}.  On most
machines, you can also use @code{$} in symbol names; exceptions are
noted in @ref{Machine Dependencies}.  That character may be followed by any
string of digits, letters, dollar signs (unless otherwise noted for a
particular target machine), and underscores.
@end ifclear
@ifset SPECIAL-SYMS
@ifset H8
Symbol names begin with a letter or with one of @samp{._}.  On the
Renesas SH you can also use @code{$} in symbol names.  That
character may be followed by any string of digits, letters, dollar signs (save
on the H8/300), and underscores.
@end ifset
@end ifset

Case of letters is significant: @code{foo} is a different symbol name
than @code{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.

@subheading Local Symbol Names

@cindex local symbol names
@cindex symbol names, local
A local symbol is any symbol beginning with certain local label prefixes.
By default, the local label prefix is @samp{.L} for ELF systems or
@samp{L} for traditional a.out systems, but each target may have its own
set of local label prefixes.
@ifset HPPA
On the HPPA local symbols begin with @samp{L$}.
@end ifset

Local symbols are defined and used within the assembler, but they are
normally not saved in object files.  Thus, they are not visible when debugging.
You may use the @samp{-L} option (@pxref{L, ,Include Local Symbols:
@option{-L}}) to retain the local symbols in the object files.

@subheading Local Labels

@cindex local labels
@cindex temporary symbol names
@cindex symbol names, temporary
Local labels help compilers and programmers use names temporarily.
They create symbols which are guaranteed to be unique over the entire scope of
the input source code and which can be referred to by a simple notation.
To define a local label, write a label of the form @samp{@b{N}:} (where @b{N}
represents any positive integer).  To refer to the most recent previous
definition of that label write @samp{@b{N}b}, using the same number as when
you defined the label.  To refer to the next definition of a local label, write
@samp{@b{N}f}---the @samp{b} stands for ``backwards'' and the @samp{f} stands
for ``forwards''.

There is no restriction on how you can use these labels, and you can reuse them
too.  So that it is possible to repeatedly define the same local label (using
the same number @samp{@b{N}}), although you can only refer to the most recently
defined local label of that number (for a backwards reference) or the next
definition of a specific local label for a forward reference.  It is also worth
noting that the first 10 local labels (@samp{@b{0:}}@dots{}@samp{@b{9:}}) are
implemented in a slightly more efficient manner than the others.

Here is an example:

@smallexample
1:        branch 1f
2:        branch 1b
1:        branch 2f
2:        branch 1b
@end smallexample

Which is the equivalent of:

@smallexample
label_1:  branch label_3
label_2:  branch label_1
label_3:  branch label_4
label_4:  branch label_3
@end smallexample

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

@table @code
@item @emph{local label prefix}
All local symbols begin with the system-specific local label prefix.
Normally both @command{@value{AS}} and @code{@value{LD}} forget symbols
that start with the local label prefix.  These labels are
used for symbols you are never intended to see.  If you use the
@samp{-L} option then @command{@value{AS}} retains these symbols in the
object file. If you also instruct @code{@value{LD}} to retain these symbols,
you may use them in debugging.

@item @var{number}
This is the number that was used in the local label definition.  So if the
label is written @samp{55:} then the number is @samp{55}. 

@item @kbd{C-B}
This unusual character is included so you do not accidentally invent a symbol
of the same name.  The character has ASCII value of @samp{\002} (control-B).

@item @emph{ordinal number}
This is a serial number to keep the labels distinct.  The first definition of
@samp{0:} gets the number @samp{1}.  The 15th definition of @samp{0:} gets the 
number @samp{15}, and so on.  Likewise the first definition of @samp{1:} gets
the number @samp{1} and its 15th definition gets @samp{15} as well.
@end table

So for example, the first @code{1:} may be named @code{.L1@kbd{C-B}1}, and
the 44th @code{3:} may be named @code{.L3@kbd{C-B}44}.

@subheading Dollar Local Labels
@cindex dollar local symbols

@code{@value{AS}} also supports an even more local form of local labels called
dollar labels.  These labels go out of scope (i.e., they become undefined) as
soon as a non-local label is defined.  Thus they remain valid for only a small
region of the input source code.  Normal local labels, by contrast, remain in
scope for the entire file, or until they are redefined by another occurrence of
the same local label.

Dollar labels are defined in exactly the same way as ordinary local labels,
except that they have a dollar sign suffix to their numeric value, e.g.,
@samp{@b{55$:}}.

They can also be distinguished from ordinary local labels by their transformed
names which use ASCII character @samp{\001} (control-A) as the magic character
to distinguish them from ordinary labels.  For example, the fifth definition of
@samp{6$} may be named @samp{.L6@kbd{C-A}5}.

@node Dot
@section The Special Dot Symbol

@cindex dot (symbol)
@cindex @code{.} (symbol)
@cindex current address
@cindex location counter
The special symbol @samp{.} refers to the current address that
@command{@value{AS}} is assembling into.  Thus, the expression @samp{melvin:
.long .} defines @code{melvin} to contain its own address.
Assigning a value to @code{.} is treated the same as a @code{.org}
directive.
@ifclear no-space-dir
Thus, the expression @samp{.=.+4} is the same as saying
@samp{.space 4}.
@end ifclear

@node Symbol Attributes
@section Symbol Attributes

@cindex symbol attributes
@cindex attributes, symbol
Every symbol has, as well as its name, the attributes ``Value'' and
``Type''.  Depending on output format, symbols can also have auxiliary
attributes.
@ifset INTERNALS
The detailed definitions are in @file{a.out.h}.
@end ifset

If you use a symbol without defining it, @command{@value{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.

@menu
* Symbol Value::                Value
* Symbol Type::                 Type
@ifset aout-bout
@ifset GENERIC
* a.out Symbols::               Symbol Attributes: @code{a.out}
@end ifset
@ifclear GENERIC
@ifclear BOUT
* a.out Symbols::               Symbol Attributes: @code{a.out}
@end ifclear
@ifset BOUT
* a.out Symbols::               Symbol Attributes: @code{a.out}, @code{b.out}
@end ifset
@end ifclear
@end ifset
@ifset COFF
* COFF Symbols::                Symbol Attributes for COFF
@end ifset
@ifset SOM
* SOM Symbols::                Symbol Attributes for SOM
@end ifset
@end menu

@node Symbol Value
@subsection Value

@cindex value of a symbol
@cindex symbol 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 @code{@value{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
@code{@value{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 @code{.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.

@node Symbol Type
@subsection Type

@cindex type of a symbol
@cindex symbol 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.

@ifset aout-bout
@ifclear GENERIC
@ifset BOUT
@c The following avoids a "widow" subsection title.  @group would be
@c better if it were available outside examples.
@need 1000
@node a.out Symbols
@subsection Symbol Attributes: @code{a.out}, @code{b.out}

@cindex @code{b.out} symbol attributes
@cindex symbol attributes, @code{b.out}
These symbol attributes appear only when @command{@value{AS}} is configured for
one of the Berkeley-descended object output formats---@code{a.out} or
@code{b.out}.

@end ifset
@ifclear BOUT
@node a.out Symbols
@subsection Symbol Attributes: @code{a.out}

@cindex @code{a.out} symbol attributes
@cindex symbol attributes, @code{a.out}

@end ifclear
@end ifclear
@ifset GENERIC
@node a.out Symbols
@subsection Symbol Attributes: @code{a.out}

@cindex @code{a.out} symbol attributes
@cindex symbol attributes, @code{a.out}

@end ifset
@menu
* Symbol Desc::                 Descriptor
* Symbol Other::                Other
@end menu

@node Symbol Desc
@subsubsection Descriptor

@cindex descriptor, of @code{a.out} symbol
This is an arbitrary 16-bit value.  You may establish a symbol's
descriptor value by using a @code{.desc} statement
(@pxref{Desc,,@code{.desc}}).  A descriptor value means nothing to
@command{@value{AS}}.

@node Symbol Other
@subsubsection Other

@cindex other attribute, of @code{a.out} symbol
This is an arbitrary 8-bit value.  It means nothing to @command{@value{AS}}.
@end ifset

@ifset COFF
@node COFF Symbols
@subsection Symbol Attributes for COFF

@cindex COFF symbol attributes
@cindex symbol attributes, COFF

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

@subsubsection Primary Attributes

@cindex primary attributes, COFF symbols
The symbol name is set with @code{.def}; the value and type,
respectively, with @code{.val} and @code{.type}.

@subsubsection Auxiliary Attributes

@cindex auxiliary attributes, COFF symbols
The @command{@value{AS}} directives @code{.dim}, @code{.line}, @code{.scl},
@code{.size}, @code{.tag}, and @code{.weak} can generate auxiliary symbol
table information for COFF.
@end ifset

@ifset SOM
@node SOM Symbols
@subsection Symbol Attributes for SOM

@cindex SOM symbol attributes
@cindex symbol attributes, SOM

The SOM format for the HPPA supports a multitude of symbol attributes set with
the @code{.EXPORT} and @code{.IMPORT} directives.

The attributes are described in @cite{HP9000 Series 800 Assembly 
Language Reference Manual} (HP 92432-90001) under the @code{IMPORT} and
@code{EXPORT} assembler directive documentation.
@end ifset

@node Expressions
@chapter Expressions

@cindex expressions
@cindex addresses
@cindex numeric values
An @dfn{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 @command{@value{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.
@command{@value{AS}} aborts with an error message in this situation.

@menu
* Empty Exprs::                 Empty Expressions
* Integer Exprs::               Integer Expressions
@end menu

@node Empty Exprs
@section Empty Expressions

@cindex empty expressions
@cindex expressions, empty
An empty expression has no value: it is just whitespace or null.
Wherever an absolute expression is required, you may omit the
expression, and @command{@value{AS}} assumes a value of (absolute) 0.  This
is compatible with other assemblers.

@node Integer Exprs
@section Integer Expressions

@cindex integer expressions
@cindex expressions, integer
An @dfn{integer expression} is one or more @emph{arguments} delimited
by @emph{operators}.

@menu
* Arguments::                   Arguments
* Operators::                   Operators
* Prefix Ops::                  Prefix Operators
* Infix Ops::                   Infix Operators
@end menu

@node Arguments
@subsection Arguments

@cindex expression arguments
@cindex arguments in expressions
@cindex operands in expressions
@cindex arithmetic operands
@dfn{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 @{@var{section} @var{NNN}@} where
@var{section} is one of text, data, bss, absolute,
or undefined.  @var{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 @command{@value{AS}} pretends
these 32 bits are an integer.  You may write integer-manipulating
instructions that act on exotic constants, compatible with other
assemblers.

@cindex subexpressions
Subexpressions are a left parenthesis @samp{(} followed by an integer
expression, followed by a right parenthesis @samp{)}; or a prefix
operator followed by an argument.

@node Operators
@subsection Operators

@cindex operators, in expressions
@cindex arithmetic functions
@cindex functions, in expressions
@dfn{Operators} are arithmetic functions, like @code{+} or @code{%}.  Prefix
operators are followed by an argument.  Infix operators appear
between their arguments.  Operators may be preceded and/or followed by
whitespace.

@node Prefix Ops
@subsection Prefix Operator

@cindex prefix operators
@command{@value{AS}} has the following @dfn{prefix operators}.  They each take
one argument, which must be absolute.

@c the tex/end tex stuff surrounding this small table is meant to make
@c it align, on the printed page, with the similar table in the next
@c section (which is inside an enumerate).
@tex
\global\advance\leftskip by \itemindent
@end tex

@table @code
@item -
@dfn{Negation}.  Two's complement negation.
@item ~
@dfn{Complementation}.  Bitwise not.
@end table

@tex
\global\advance\leftskip by -\itemindent
@end tex

@node Infix Ops
@subsection Infix Operators

@cindex infix operators
@cindex operators, permitted arguments
@dfn{Infix operators} take two arguments, one on either side.  Operators
have precedence, but operations with equal precedence are performed left
to right.  Apart from @code{+} or @option{-}, both arguments must be
absolute, and the result is absolute.

@enumerate
@cindex operator precedence
@cindex precedence of operators

@item
Highest Precedence

@table @code
@item *
@dfn{Multiplication}.

@item /
@dfn{Division}.  Truncation is the same as the C operator @samp{/}

@item %
@dfn{Remainder}.

@item <<
@dfn{Shift Left}.  Same as the C operator @samp{<<}.

@item >>
@dfn{Shift Right}.  Same as the C operator @samp{>>}.
@end table

@item
Intermediate precedence

@table @code
@item |

@dfn{Bitwise Inclusive Or}.

@item &
@dfn{Bitwise And}.

@item ^
@dfn{Bitwise Exclusive Or}.

@item !
@dfn{Bitwise Or Not}.
@end table

@item
Low Precedence

@table @code
@cindex addition, permitted arguments
@cindex plus, permitted arguments
@cindex arguments for addition
@item +
@dfn{Addition}.  If either argument is absolute, the result has the section of
the other argument.  You may not add together arguments from different
sections.

@cindex subtraction, permitted arguments
@cindex minus, permitted arguments
@cindex arguments for subtraction
@item -
@dfn{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.
@c FIXME is there still something useful to say about undefined - undefined ?

@cindex comparison expressions
@cindex expressions, comparison
@item  ==
@dfn{Is Equal To}
@item <>
@itemx !=
@dfn{Is Not Equal To}
@item <
@dfn{Is Less Than}
@item >
@dfn{Is Greater Than}
@item >=
@dfn{Is Greater Than Or Equal To}
@item <=
@dfn{Is Less Than Or Equal To}

The comparison operators can be used as infix operators.  A true results has a
value of -1 whereas a false result has a value of 0.   Note, these operators
perform signed comparisons.
@end table

@item Lowest Precedence

@table @code
@item &&
@dfn{Logical And}.

@item ||
@dfn{Logical Or}.

These two logical operations can be used to combine the results of sub
expressions.  Note, unlike the comparison operators a true result returns a
value of 1 but a false results does still return 0.  Also note that the logical
or operator has a slightly lower precedence than logical and.

@end table
@end enumerate

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

@node Pseudo Ops
@chapter Assembler Directives

@cindex directives, machine independent
@cindex pseudo-ops, machine independent
@cindex machine independent directives
All assembler directives have names that begin with a period (@samp{.}).
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 @sc{gnu} assembler.
@ifset GENERIC
Some machine configurations provide additional directives.
@xref{Machine Dependencies}.
@end ifset
@ifclear GENERIC
@ifset machine-directives
@xref{Machine Dependencies}, for additional directives.
@end ifset
@end ifclear

@menu
* Abort::                       @code{.abort}
@ifset COFF
* ABORT (COFF)::                @code{.ABORT}
@end ifset

* Align::                       @code{.align @var{abs-expr} , @var{abs-expr}}
* Altmacro::                    @code{.altmacro}
* Ascii::                       @code{.ascii "@var{string}"}@dots{}
* Asciz::                       @code{.asciz "@var{string}"}@dots{}
* Balign::                      @code{.balign @var{abs-expr} , @var{abs-expr}}
* Byte::                        @code{.byte @var{expressions}}
* CFI directives::		@code{.cfi_startproc [simple]}, @code{.cfi_endproc}, etc.
* Comm::                        @code{.comm @var{symbol} , @var{length} }
* Data::                        @code{.data @var{subsection}}
@ifset COFF
* Def::                         @code{.def @var{name}}
@end ifset
@ifset aout-bout
* Desc::                        @code{.desc @var{symbol}, @var{abs-expression}}
@end ifset
@ifset COFF
* Dim::                         @code{.dim}
@end ifset

* Double::                      @code{.double @var{flonums}}
* Eject::                       @code{.eject}
* Else::                        @code{.else}
* Elseif::                      @code{.elseif}
* End::				@code{.end}
@ifset COFF
* Endef::                       @code{.endef}
@end ifset

* Endfunc::                     @code{.endfunc}
* Endif::                       @code{.endif}
* Equ::                         @code{.equ @var{symbol}, @var{expression}}
* Equiv::                       @code{.equiv @var{symbol}, @var{expression}}
* Eqv::                         @code{.eqv @var{symbol}, @var{expression}}
* Err::				@code{.err}
* Error::			@code{.error @var{string}}
* Exitm::			@code{.exitm}
* Extern::                      @code{.extern}
* Fail::			@code{.fail}
* File::                        @code{.file}
* Fill::                        @code{.fill @var{repeat} , @var{size} , @var{value}}
* Float::                       @code{.float @var{flonums}}
* Func::                        @code{.func}  
* Global::                      @code{.global @var{symbol}}, @code{.globl @var{symbol}}
@ifset ELF
* Gnu_attribute::               @code{.gnu_attribute @var{tag},@var{value}}
* Hidden::                      @code{.hidden @var{names}}
@end ifset

* hword::                       @code{.hword @var{expressions}}
* Ident::                       @code{.ident}
* If::                          @code{.if @var{absolute expression}}
* Incbin::                      @code{.incbin "@var{file}"[,@var{skip}[,@var{count}]]}
* Include::                     @code{.include "@var{file}"}
* Int::                         @code{.int @var{expressions}}
@ifset ELF
* Internal::                    @code{.internal @var{names}}
@end ifset

* Irp::				@code{.irp @var{symbol},@var{values}}@dots{}
* Irpc::			@code{.irpc @var{symbol},@var{values}}@dots{}
* Lcomm::                       @code{.lcomm @var{symbol} , @var{length}}
* Lflags::                      @code{.lflags}
@ifclear no-line-dir
* Line::                        @code{.line @var{line-number}}
@end ifclear

* Linkonce::			@code{.linkonce [@var{type}]}
* List::                        @code{.list}
* Ln::                          @code{.ln @var{line-number}}
* Loc::                         @code{.loc @var{fileno} @var{lineno}}
* Loc_mark_labels::             @code{.loc_mark_labels @var{enable}}
@ifset ELF
* Local::                       @code{.local @var{names}}
@end ifset

* Long::                        @code{.long @var{expressions}}
@ignore
* Lsym::                        @code{.lsym @var{symbol}, @var{expression}}
@end ignore

* Macro::			@code{.macro @var{name} @var{args}}@dots{}
* MRI::				@code{.mri @var{val}}
* Noaltmacro::                  @code{.noaltmacro}
* Nolist::                      @code{.nolist}
* Octa::                        @code{.octa @var{bignums}}
* Org::                         @code{.org @var{new-lc}, @var{fill}}
* P2align::                     @code{.p2align @var{abs-expr}, @var{abs-expr}, @var{abs-expr}}
@ifset ELF
* PopSection::                  @code{.popsection}
* Previous::                    @code{.previous}
@end ifset

* Print::			@code{.print @var{string}}
@ifset ELF
* Protected::                   @code{.protected @var{names}}
@end ifset

* Psize::                       @code{.psize @var{lines}, @var{columns}}
* Purgem::			@code{.purgem @var{name}}
@ifset ELF
* PushSection::                 @code{.pushsection @var{name}}
@end ifset

* Quad::                        @code{.quad @var{bignums}}
* Reloc::			@code{.reloc @var{offset}, @var{reloc_name}[, @var{expression}]}
* Rept::			@code{.rept @var{count}}
* Sbttl::                       @code{.sbttl "@var{subheading}"}
@ifset COFF
* Scl::                         @code{.scl @var{class}}
@end ifset
@ifset COFF-ELF
* Section::                     @code{.section @var{name}[, @var{flags}]}
@end ifset

* Set::                         @code{.set @var{symbol}, @var{expression}}
* Short::                       @code{.short @var{expressions}}
* Single::                      @code{.single @var{flonums}}
@ifset COFF-ELF
* Size::                        @code{.size [@var{name} , @var{expression}]}
@end ifset
@ifclear no-space-dir
* Skip::                        @code{.skip @var{size} , @var{fill}}
@end ifclear

* Sleb128::			@code{.sleb128 @var{expressions}}
@ifclear no-space-dir
* Space::                       @code{.space @var{size} , @var{fill}}
@end ifclear
@ifset have-stabs
* Stab::                        @code{.stabd, .stabn, .stabs}
@end ifset

* String::                      @code{.string "@var{str}"}, @code{.string8 "@var{str}"}, @code{.string16 "@var{str}"}, @code{.string32 "@var{str}"}, @code{.string64 "@var{str}"}
* Struct::			@code{.struct @var{expression}}
@ifset ELF
* SubSection::                  @code{.subsection}
* Symver::                      @code{.symver @var{name},@var{name2@@nodename}}
@end ifset

@ifset COFF
* Tag::                         @code{.tag @var{structname}}
@end ifset

* Text::                        @code{.text @var{subsection}}
* Title::                       @code{.title "@var{heading}"}
@ifset COFF-ELF
* Type::                        @code{.type <@var{int} | @var{name} , @var{type description}>}
@end ifset

* Uleb128::                     @code{.uleb128 @var{expressions}}
@ifset COFF
* Val::                         @code{.val @var{addr}}
@end ifset

@ifset ELF
* Version::                     @code{.version "@var{string}"}
* VTableEntry::                 @code{.vtable_entry @var{table}, @var{offset}}
* VTableInherit::               @code{.vtable_inherit @var{child}, @var{parent}}
@end ifset

* Warning::			@code{.warning @var{string}}
* Weak::                        @code{.weak @var{names}}
* Weakref::                     @code{.weakref @var{alias}, @var{symbol}}
* Word::                        @code{.word @var{expressions}}
* Deprecated::                  Deprecated Directives
@end menu

@node Abort
@section @code{.abort}

@cindex @code{abort} directive
@cindex stopping the assembly
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 @command{@value{AS}} to
quit also.  One day @code{.abort} will not be supported.

@ifset COFF
@node ABORT (COFF)
@section @code{.ABORT} (COFF)

@cindex @code{ABORT} directive
When producing COFF output, @command{@value{AS}} accepts this directive as a
synonym for @samp{.abort}.

@ifset BOUT
When producing @code{b.out} output, @command{@value{AS}} accepts this directive,
but ignores it.
@end ifset
@end ifset

@node Align
@section @code{.align @var{abs-expr}, @var{abs-expr}, @var{abs-expr}}

@cindex padding the location counter
@cindex @code{align} directive
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 arc, hppa, i386 using ELF, i860, iq2000, m68k, or32,
s390, sparc, tic4x, tic80 and xtensa, the first expression is the
alignment request in bytes.  For example @samp{.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 the tic54x, the
first expression is the alignment request in words.

For other systems, including ppc, i386 using a.out format, arm and
strongarm, it is the
number of low-order zero bits the location counter must have after
advancement.  For example @samp{.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 @code{.balign} and @code{.p2align} directives,
described later, which have a consistent behavior across all
architectures (but are specific to GAS).

@node Altmacro
@section @code{.altmacro}
Enable alternate macro mode, enabling:

@ftable @code
@item LOCAL @var{name} [ , @dots{} ]
One additional directive, @code{LOCAL}, is available.  It is used to
generate a string replacement for each of the @var{name} arguments, and
replace any instances of @var{name} in each macro expansion.  The
replacement string is unique in the assembly, and different for each
separate macro expansion.  @code{LOCAL} allows you to write macros that
define symbols, without fear of conflict between separate macro expansions.

@item String delimiters
You can write strings delimited in these other ways besides
@code{"@var{string}"}:

@table @code
@item '@var{string}'
You can delimit strings with single-quote characters.

@item <@var{string}>
You can delimit strings with matching angle brackets.
@end table

@item single-character string escape
To include any single character literally in a string (even if the
character would otherwise have some special meaning), you can prefix the
character with @samp{!} (an exclamation mark).  For example, you can
write @samp{<4.3 !> 5.4!!>} to get the literal text @samp{4.3 > 5.4!}.

@item Expression results as strings
You can write @samp{%@var{expr}} to evaluate the expression @var{expr}
and use the result as a string.  
@end ftable

@node Ascii
@section @code{.ascii "@var{string}"}@dots{}

@cindex @code{ascii} directive
@cindex string literals
@code{.ascii} expects zero or more string literals (@pxref{Strings})
separated by commas.  It assembles each string (with no automatic
trailing zero byte) into consecutive addresses.

@node Asciz
@section @code{.asciz "@var{string}"}@dots{}

@cindex @code{asciz} directive
@cindex zero-terminated strings
@cindex null-terminated strings
@code{.asciz} is just like @code{.ascii}, but each string is followed by
a zero byte.  The ``z'' in @samp{.asciz} stands for ``zero''.

@node Balign
@section @code{.balign[wl] @var{abs-expr}, @var{abs-expr}, @var{abs-expr}}

@cindex padding the location counter given number of bytes
@cindex @code{balign} directive
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 @samp{.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.

@cindex @code{balignw} directive
@cindex @code{balignl} directive
The @code{.balignw} and @code{.balignl} directives are variants of the
@code{.balign} directive.  The @code{.balignw} directive treats the fill
pattern as a two byte word value.  The @code{.balignl} directives treats the
fill pattern as a four byte longword value.  For example, @code{.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.

@node Byte
@section @code{.byte @var{expressions}}

@cindex @code{byte} directive
@cindex integers, one byte
@code{.byte} expects zero or more expressions, separated by commas.
Each expression is assembled into the next byte.

@node CFI directives
@section @code{.cfi_startproc [simple]}
@cindex @code{cfi_startproc} directive
@code{.cfi_startproc} is used at the beginning of each function that
should have an entry in @code{.eh_frame}. It initializes some internal
data structures. Don't forget to close the function by
@code{.cfi_endproc}.

Unless @code{.cfi_startproc} is used along with parameter @code{simple} 
it also emits some architecture dependent initial CFI instructions.
 
@section @code{.cfi_endproc}
@cindex @code{cfi_endproc} directive
@code{.cfi_endproc} is used at the end of a function where it closes its
unwind entry previously opened by
@code{.cfi_startproc}, and emits it to @code{.eh_frame}.

@section @code{.cfi_personality @var{encoding} [, @var{exp}]}
@code{.cfi_personality} defines personality routine and its encoding.
@var{encoding} must be a constant determining how the personality
should be encoded.  If it is 255 (@code{DW_EH_PE_omit}), second
argument is not present, otherwise second argument should be
a constant or a symbol name.  When using indirect encodings,
the symbol provided should be the location where personality
can be loaded from, not the personality routine itself.
The default after @code{.cfi_startproc} is @code{.cfi_personality 0xff},
no personality routine.

@section @code{.cfi_lsda @var{encoding} [, @var{exp}]}
@code{.cfi_lsda} defines LSDA and its encoding.
@var{encoding} must be a constant determining how the LSDA
should be encoded.  If it is 255 (@code{DW_EH_PE_omit}), second
argument is not present, otherwise second argument should be a constant
or a symbol name.  The default after @code{.cfi_startproc} is @code{.cfi_lsda 0xff},
no LSDA.

@section @code{.cfi_def_cfa @var{register}, @var{offset}}
@code{.cfi_def_cfa} defines a rule for computing CFA as: @i{take 
address from @var{register} and add @var{offset} to it}.

@section @code{.cfi_def_cfa_register @var{register}}
@code{.cfi_def_cfa_register} modifies a rule for computing CFA. From
now on @var{register} will be used instead of the old one. Offset
remains the same.

@section @code{.cfi_def_cfa_offset @var{offset}}
@code{.cfi_def_cfa_offset} modifies a rule for computing CFA. Register
remains the same, but @var{offset} is new. Note that it is the
absolute offset that will be added to a defined register to compute
CFA address.

@section @code{.cfi_adjust_cfa_offset @var{offset}}
Same as @code{.cfi_def_cfa_offset} but @var{offset} is a relative
value that is added/substracted from the previous offset.

@section @code{.cfi_offset @var{register}, @var{offset}}
Previous value of @var{register} is saved at offset @var{offset} from
CFA. 

@section @code{.cfi_rel_offset @var{register}, @var{offset}}
Previous value of @var{register} is saved at offset @var{offset} from
the current CFA register.  This is transformed to @code{.cfi_offset}
using the known displacement of the CFA register from the CFA.
This is often easier to use, because the number will match the
code it's annotating.

@section @code{.cfi_register @var{register1}, @var{register2}}
Previous value of @var{register1} is saved in register @var{register2}.

@section @code{.cfi_restore @var{register}}
@code{.cfi_restore} says that the rule for @var{register} is now the 
same as it was at the beginning of the function, after all initial 
instruction added by @code{.cfi_startproc} were executed.

@section @code{.cfi_undefined @var{register}}
From now on the previous value of @var{register} can't be restored anymore.

@section @code{.cfi_same_value @var{register}}
Current value of @var{register} is the same like in the previous frame, 
i.e. no restoration needed.

@section @code{.cfi_remember_state}, 
First save all current rules for all registers by @code{.cfi_remember_state}, 
then totally screw them up by subsequent @code{.cfi_*} directives and when 
everything is hopelessly bad, use @code{.cfi_restore_state} to restore 
the previous saved state.

@section @code{.cfi_return_column @var{register}}
Change return column @var{register}, i.e. the return address is either 
directly in @var{register} or can be accessed by rules for @var{register}.

@section @code{.cfi_signal_frame}
Mark current function as signal trampoline.

@section @code{.cfi_window_save}
SPARC register window has been saved.

@section @code{.cfi_escape} @var{expression}[, @dots{}]
Allows the user to add arbitrary bytes to the unwind info.  One
might use this to add OS-specific CFI opcodes, or generic CFI
opcodes that GAS does not yet support.

@section @code{.cfi_val_encoded_addr @var{register}, @var{encoding}, @var{label}}
The current value of @var{register} is @var{label}.  The value of @var{label}
will be encoded in the output file according to @var{encoding}; see the
description of @code{.cfi_personality} for details on this encoding.

The usefulness of equating a register to a fixed label is probably
limited to the return address register.  Here, it can be useful to
mark a code segment that has only one return address which is reached
by a direct branch and no copy of the return address exists in memory
or another register.

@node Comm
@section @code{.comm @var{symbol} , @var{length} }

@cindex @code{comm} directive
@cindex symbol, common
@code{.comm} declares a common symbol named @var{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 @code{@value{LD}} does not see a
definition for the symbol--just one or more common symbols--then it will
allocate @var{length} bytes of uninitialized memory.  @var{length} must be an
absolute expression.  If @code{@value{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.

@ifset COFF-ELF
When using ELF or (as a GNU extension) PE, the @code{.comm} directive takes
an optional third argument.  This is the desired alignment of the symbol, 
specified for ELF as a byte boundary (for example, an alignment of 16 means
that the least significant 4 bits of the address should be zero), and for PE
as a power of two (for example, an alignment of 5 means aligned to a 32-byte
boundary).  The alignment must be an absolute expression, and it must be a 
power of two.  If @code{@value{LD}} allocates uninitialized memory for the
common symbol, it will use the alignment when placing the symbol.  If no 
alignment is specified, @command{@value{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 on ELF, or the default section alignment of 4 on PE@footnote{This
is not the same as the executable image file alignment controlled by @code{@value{LD}}'s
@samp{--section-alignment} option; image file sections in PE are aligned to
multiples of 4096, which is far too large an alignment for ordinary variables.
It is rather the default alignment for (non-debug) sections within object
(@samp{*.o}) files, which are less strictly aligned.}.
@end ifset

@ifset HPPA
The syntax for @code{.comm} differs slightly on the HPPA.  The syntax is
@samp{@var{symbol} .comm, @var{length}}; @var{symbol} is optional.
@end ifset

@node Data
@section @code{.data @var{subsection}}

@cindex @code{data} directive
@code{.data} tells @command{@value{AS}} to assemble the following statements onto the
end of the data subsection numbered @var{subsection} (which is an
absolute expression).  If @var{subsection} is omitted, it defaults
to zero.

@ifset COFF
@node Def
@section @code{.def @var{name}}

@cindex @code{def} directive
@cindex COFF symbols, debugging
@cindex debugging COFF symbols
Begin defining debugging information for a symbol @var{name}; the
definition extends until the @code{.endef} directive is encountered.
@ifset BOUT

This directive is only observed when @command{@value{AS}} is configured for COFF
format output; when producing @code{b.out}, @samp{.def} is recognized,
but ignored.
@end ifset
@end ifset

@ifset aout-bout
@node Desc
@section @code{.desc @var{symbol}, @var{abs-expression}}

@cindex @code{desc} directive
@cindex COFF symbol descriptor
@cindex symbol descriptor, COFF
This directive sets the descriptor of the symbol (@pxref{Symbol Attributes})
to the low 16 bits of an absolute expression.

@ifset COFF
The @samp{.desc} directive is not available when @command{@value{AS}} is
configured for COFF output; it is only for @code{a.out} or @code{b.out}
object format.  For the sake of compatibility, @command{@value{AS}} accepts
it, but produces no output, when configured for COFF.
@end ifset
@end ifset

@ifset COFF
@node Dim
@section @code{.dim}

@cindex @code{dim} directive
@cindex COFF auxiliary symbol information
@cindex auxiliary symbol information, COFF
This directive is generated by compilers to include auxiliary debugging
information in the symbol table.  It is only permitted inside
@code{.def}/@code{.endef} pairs.
@ifset BOUT

@samp{.dim} is only meaningful when generating COFF format output; when
@command{@value{AS}} is generating @code{b.out}, it accepts this directive but
ignores it.
@end ifset
@end ifset

@node Double
@section @code{.double @var{flonums}}

@cindex @code{double} directive
@cindex floating point numbers (double)
@code{.double} expects zero or more flonums, separated by commas.  It
assembles floating point numbers.
@ifset GENERIC
The exact kind of floating point numbers emitted depends on how
@command{@value{AS}} is configured.  @xref{Machine Dependencies}.
@end ifset
@ifclear GENERIC
@ifset IEEEFLOAT
On the @value{TARGET} family @samp{.double} emits 64-bit floating-point numbers
in @sc{ieee} format.
@end ifset
@end ifclear

@node Eject
@section @code{.eject}

@cindex @code{eject} directive
@cindex new page, in listings
@cindex page, in listings
@cindex listing control: new page
Force a page break at this point, when generating assembly listings.

@node Else
@section @code{.else}

@cindex @code{else} directive
@code{.else} is part of the @command{@value{AS}} support for conditional
assembly; see @ref{If,,@code{.if}}.  It marks the beginning of a section
of code to be assembled if the condition for the preceding @code{.if}
was false.

@node Elseif
@section @code{.elseif}

@cindex @code{elseif} directive
@code{.elseif} is part of the @command{@value{AS}} support for conditional
assembly; see @ref{If,,@code{.if}}.  It is shorthand for beginning a new
@code{.if} block that would otherwise fill the entire @code{.else} section.

@node End
@section @code{.end}

@cindex @code{end} directive
@code{.end} marks the end of the assembly file.  @command{@value{AS}} does not
process anything in the file past the @code{.end} directive.

@ifset COFF
@node Endef
@section @code{.endef}

@cindex @code{endef} directive
This directive flags the end of a symbol definition begun with
@code{.def}.
@ifset BOUT

@samp{.endef} is only meaningful when generating COFF format output; if
@command{@value{AS}} is configured to generate @code{b.out}, it accepts this
directive but ignores it.
@end ifset
@end ifset

@node Endfunc
@section @code{.endfunc}
@cindex @code{endfunc} directive
@code{.endfunc} marks the end of a function specified with @code{.func}.

@node Endif
@section @code{.endif}

@cindex @code{endif} directive
@code{.endif} is part of the @command{@value{AS}} support for conditional assembly;
it marks the end of a block of code that is only assembled
conditionally.  @xref{If,,@code{.if}}.

@node Equ
@section @code{.equ @var{symbol}, @var{expression}}

@cindex @code{equ} directive
@cindex assigning values to symbols
@cindex symbols, assigning values to
This directive sets the value of @var{symbol} to @var{expression}.
It is synonymous with @samp{.set}; see @ref{Set,,@code{.set}}.

@ifset HPPA
The syntax for @code{equ} on the HPPA is 
@samp{@var{symbol} .equ @var{expression}}.
@end ifset

@ifset Z80
The syntax for @code{equ} on the Z80 is 
@samp{@var{symbol} equ @var{expression}}. 
On the Z80 it is an eror if @var{symbol} is already defined,
but the symbol is not protected from later redefinition. 
Compare @ref{Equiv}.
@end ifset

@node Equiv
@section @code{.equiv @var{symbol}, @var{expression}}
@cindex @code{equiv} directive
The @code{.equiv} directive is like @code{.equ} and @code{.set}, except that
the assembler will signal an error if @var{symbol} is already defined.  Note a
symbol which has been referenced but not actually defined is considered to be
undefined.

Except for the contents of the error message, this is roughly equivalent to 
@smallexample
.ifdef SYM
.err
.endif
.equ SYM,VAL
@end smallexample
plus it protects the symbol from later redefinition.

@node Eqv
@section @code{.eqv @var{symbol}, @var{expression}}
@cindex @code{eqv} directive
The @code{.eqv} directive is like @code{.equiv}, but no attempt is made to
evaluate the expression or any part of it immediately.  Instead each time
the resulting symbol is used in an expression, a snapshot of its current
value is taken.

@node Err
@section @code{.err}
@cindex @code{err} directive
If @command{@value{AS}} assembles a @code{.err} directive, it will print an error
message and, unless the @option{-Z} option was used, it will not generate an
object file.  This can be used to signal an error in conditionally compiled code.

@node Error
@section @code{.error "@var{string}"}
@cindex error directive

Similarly to @code{.err}, this directive emits an error, but you can specify a
string that will be emitted as the error message.  If you don't specify the
message, it defaults to @code{".error directive invoked in source file"}.
@xref{Errors, ,Error and Warning Messages}.

@smallexample
 .error "This code has not been assembled and tested."
@end smallexample

@node Exitm
@section @code{.exitm}
Exit early from the current macro definition.  @xref{Macro}.

@node Extern
@section @code{.extern}

@cindex @code{extern} directive
@code{.extern} is accepted in the source program---for compatibility
with other assemblers---but it is ignored.  @command{@value{AS}} treats
all undefined symbols as external.

@node Fail
@section @code{.fail @var{expression}}

@cindex @code{fail} directive
Generates an error or a warning.  If the value of the @var{expression} is 500
or more, @command{@value{AS}} will print a warning message.  If the value is less
than 500, @command{@value{AS}} will print an error message.  The message will
include the value of @var{expression}.  This can occasionally be useful inside
complex nested macros or conditional assembly.

@node File
@section @code{.file}
@cindex @code{file} directive

@ifclear no-file-dir
There are two different versions of the @code{.file} directive.  Targets
that support DWARF2 line number information use the DWARF2 version of
@code{.file}.  Other targets use the default version.

@subheading Default Version

@cindex logical file name
@cindex file name, logical
This version of the @code{.file} directive tells @command{@value{AS}} that we
are about to start a new logical file.  The syntax is:

@smallexample
.file @var{string}
@end smallexample

@var{string} is the new file name.  In general, the filename is
recognized whether or not it is surrounded by quotes @samp{"}; but if you wish
to specify an empty file name, you must give the quotes--@code{""}.  This
statement may go away in future: it is only recognized to be compatible with
old @command{@value{AS}} programs.

@subheading DWARF2 Version
@end ifclear

When emitting DWARF2 line number information, @code{.file} assigns filenames
to the @code{.debug_line} file name table.  The syntax is:

@smallexample
.file @var{fileno} @var{filename}
@end smallexample

The @var{fileno} operand should be a unique positive integer to use as the
index of the entry in the table.  The @var{filename} operand is a C string
literal.

The detail of filename indices is exposed to the user because the filename
table is shared with the @code{.debug_info} section of the DWARF2 debugging
information, and thus the user must know the exact indices that table
entries will have.

@node Fill
@section @code{.fill @var{repeat} , @var{size} , @var{value}}

@cindex @code{fill} directive
@cindex writing patterns in memory
@cindex patterns, writing in memory
@var{repeat}, @var{size} and @var{value} are absolute expressions.
This emits @var{repeat} copies of @var{size} bytes.  @var{Repeat}
may be zero or more.  @var{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 @var{repeat} bytes
is taken from an 8-byte number.  The highest order 4 bytes are
zero.  The lowest order 4 bytes are @var{value} rendered in the
byte-order of an integer on the computer @command{@value{AS}} is assembling for.
Each @var{size} bytes in a repetition is taken from the lowest order
@var{size} bytes of this number.  Again, this bizarre behavior is
compatible with other people's assemblers.

@var{size} and @var{value} are optional.
If the second comma and @var{value} are absent, @var{value} is
assumed zero.  If the first comma and following tokens are absent,
@var{size} is assumed to be 1.

@node Float
@section @code{.float @var{flonums}}

@cindex floating point numbers (single)
@cindex @code{float} directive
This directive assembles zero or more flonums, separated by commas.  It
has the same effect as @code{.single}.
@ifset GENERIC
The exact kind of floating point numbers emitted depends on how
@command{@value{AS}} is configured.
@xref{Machine Dependencies}.
@end ifset
@ifclear GENERIC
@ifset IEEEFLOAT
On the @value{TARGET} family, @code{.float} emits 32-bit floating point numbers
in @sc{ieee} format.
@end ifset
@end ifclear

@node Func
@section @code{.func @var{name}[,@var{label}]}
@cindex @code{func} directive
@code{.func} emits debugging information to denote function @var{name}, and
is ignored unless the file is assembled with debugging enabled.
Only @samp{--gstabs[+]} is currently supported.
@var{label} is the entry point of the function and if omitted @var{name}
prepended with the @samp{leading char} is used.
@samp{leading char} is usually @code{_} or nothing, depending on the target.
All functions are currently defined to have @code{void} return type.
The function must be terminated with @code{.endfunc}.

@node Global
@section @code{.global @var{symbol}}, @code{.globl @var{symbol}}

@cindex @code{global} directive
@cindex symbol, making visible to linker
@code{.global} makes the symbol visible to @code{@value{LD}}.  If you define
@var{symbol} in your partial program, its value is made available to
other partial programs that are linked with it.  Otherwise,
@var{symbol} takes its attributes from a symbol of the same name
from another file linked into the same program.

Both spellings (@samp{.globl} and @samp{.global}) are accepted, for
compatibility with other assemblers.

@ifset HPPA
On the HPPA, @code{.global} is not always enough to make it accessible to other
partial programs.  You may need the HPPA-only @code{.EXPORT} directive as well.
@xref{HPPA Directives, ,HPPA Assembler Directives}.
@end ifset

@ifset ELF
@node Gnu_attribute
@section @code{.gnu_attribute @var{tag},@var{value}}
Record a @sc{gnu} object attribute for this file.  @xref{Object Attributes}.

@node Hidden
@section @code{.hidden @var{names}}

@cindex @code{hidden} directive
@cindex visibility
This is one of the ELF visibility directives.  The other two are
@code{.internal} (@pxref{Internal,,@code{.internal}}) and 
@code{.protected} (@pxref{Protected,,@code{.protected}}).

This directive overrides the named symbols default visibility (which is set by
their binding: local, global or weak).  The directive sets the visibility to
@code{hidden} which means that the symbols are not visible to other components.
Such symbols are always considered to be @code{protected} as well. 
@end ifset

@node hword
@section @code{.hword @var{expressions}}

@cindex @code{hword} directive
@cindex integers, 16-bit
@cindex numbers, 16-bit
@cindex sixteen bit integers
This expects zero or more @var{expressions}, and emits
a 16 bit number for each.

@ifset GENERIC
This directive is a synonym for @samp{.short}; depending on the target
architecture, it may also be a synonym for @samp{.word}.
@end ifset
@ifclear GENERIC
@ifset W32
This directive is a synonym for @samp{.short}.
@end ifset
@ifset W16
This directive is a synonym for both @samp{.short} and @samp{.word}.
@end ifset
@end ifclear

@node Ident
@section @code{.ident}

@cindex @code{ident} directive

This directive is used by some assemblers to place tags in object files.  The
behavior of this directive varies depending on the target.  When using the
a.out object file format, @command{@value{AS}} simply accepts the directive for
source-file compatibility with existing assemblers, but does not emit anything
for it.  When using COFF, comments are emitted to the @code{.comment} or
@code{.rdata} section, depending on the target.  When using ELF, comments are
emitted to the @code{.comment} section.

@node If
@section @code{.if @var{absolute expression}}

@cindex conditional assembly
@cindex @code{if} directive
@code{.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 @var{absolute expression}) is non-zero.  The end of
the conditional section of code must be marked by @code{.endif}
(@pxref{Endif,,@code{.endif}}); optionally, you may include code for the
alternative condition, flagged by @code{.else} (@pxref{Else,,@code{.else}}).
If you have several conditions to check, @code{.elseif} may be used to avoid
nesting blocks if/else within each subsequent @code{.else} block.

The following variants of @code{.if} are also supported:
@table @code
@cindex @code{ifdef} directive
@item .ifdef @var{symbol}
Assembles the following section of code if the specified @var{symbol}
has been defined.  Note a symbol which has been referenced but not yet defined
is considered to be undefined.

@cindex @code{ifb} directive
@item .ifb @var{text}
Assembles the following section of code if the operand is blank (empty).

@cindex @code{ifc} directive
@item .ifc @var{string1},@var{string2}
Assembles the following section of code if the two strings are the same.  The
strings may be optionally quoted with single quotes.  If they are not quoted,
the first string stops at the first comma, and the second string stops at the
end of the line.  Strings which contain whitespace should be quoted.  The
string comparison is case sensitive.

@cindex @code{ifeq} directive
@item .ifeq @var{absolute expression}
Assembles the following section of code if the argument is zero.

@cindex @code{ifeqs} directive
@item .ifeqs @var{string1},@var{string2}
Another form of @code{.ifc}.  The strings must be quoted using double quotes.

@cindex @code{ifge} directive
@item .ifge @var{absolute expression}
Assembles the following section of code if the argument is greater than or
equal to zero.

@cindex @code{ifgt} directive
@item .ifgt @var{absolute expression}
Assembles the following section of code if the argument is greater than zero.

@cindex @code{ifle} directive
@item .ifle @var{absolute expression}
Assembles the following section of code if the argument is less than or equal
to zero.

@cindex @code{iflt} directive
@item .iflt @var{absolute expression}
Assembles the following section of code if the argument is less than zero.

@cindex @code{ifnb} directive
@item .ifnb @var{text}
Like @code{.ifb}, but the sense of the test is reversed: this assembles the
following section of code if the operand is non-blank (non-empty).

@cindex @code{ifnc} directive
@item .ifnc @var{string1},@var{string2}.
Like @code{.ifc}, but the sense of the test is reversed: this assembles the
following section of code if the two strings are not the same.

@cindex @code{ifndef} directive
@cindex @code{ifnotdef} directive
@item .ifndef @var{symbol}
@itemx .ifnotdef @var{symbol}
Assembles the following section of code if the specified @var{symbol}
has not been defined.  Both spelling variants are equivalent.  Note a symbol
which has been referenced but not yet defined is considered to be undefined.

@cindex @code{ifne} directive
@item .ifne @var{absolute expression}
Assembles the following section of code if the argument is not equal to zero
(in other words, this is equivalent to @code{.if}).

@cindex @code{ifnes} directive
@item .ifnes @var{string1},@var{string2}
Like @code{.ifeqs}, but the sense of the test is reversed: this assembles the
following section of code if the two strings are not the same.
@end table

@node Incbin
@section @code{.incbin "@var{file}"[,@var{skip}[,@var{count}]]}

@cindex @code{incbin} directive
@cindex binary files, including
The @code{incbin} directive includes @var{file} verbatim at the current
location. You can control the search paths used with the @samp{-I} command-line
option (@pxref{Invoking,,Command-Line Options}).  Quotation marks are required
around @var{file}.

The @var{skip} argument skips a number of bytes from the start of the
@var{file}.  The @var{count} argument indicates the maximum number of bytes to
read.  Note that the data is not aligned in any way, so it is the user's
responsibility to make sure that proper alignment is provided both before and
after the @code{incbin} directive.

@node Include
@section @code{.include "@var{file}"}

@cindex @code{include} directive
@cindex supporting files, including
@cindex files, including
This directive provides a way to include supporting files at specified
points in your source program.  The code from @var{file} is assembled as
if it followed the point of the @code{.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 @samp{-I} command-line option
(@pxref{Invoking,,Command-Line Options}).  Quotation marks are required
around @var{file}.

@node Int
@section @code{.int @var{expressions}}

@cindex @code{int} directive
@cindex integers, 32-bit
Expect zero or more @var{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.

@ifclear GENERIC
@ifset H8
On most forms of the H8/300, @code{.int} emits 16-bit
integers.  On the H8/300H and the Renesas SH, however, @code{.int} emits
32-bit integers.
@end ifset
@end ifclear

@ifset ELF
@node Internal
@section @code{.internal @var{names}}

@cindex @code{internal} directive
@cindex visibility
This is one of the ELF visibility directives.  The other two are
@code{.hidden} (@pxref{Hidden,,@code{.hidden}}) and 
@code{.protected} (@pxref{Protected,,@code{.protected}}).

This directive overrides the named symbols default visibility (which is set by
their binding: local, global or weak).  The directive sets the visibility to
@code{internal} which means that the symbols are considered to be @code{hidden}
(i.e., not visible to other components), and that some extra, processor specific
processing must also be performed upon the  symbols as well.
@end ifset

@node Irp
@section @code{.irp @var{symbol},@var{values}}@dots{}

@cindex @code{irp} directive
Evaluate a sequence of statements assigning different values to @var{symbol}.
The sequence of statements starts at the @code{.irp} directive, and is
terminated by an @code{.endr} directive.  For each @var{value}, @var{symbol} is
set to @var{value}, and the sequence of statements is assembled.  If no
@var{value} is listed, the sequence of statements is assembled once, with
@var{symbol} set to the null string.  To refer to @var{symbol} within the
sequence of statements, use @var{\symbol}.

For example, assembling

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

is equivalent to assembling

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

For some caveats with the spelling of @var{symbol}, see also @ref{Macro}.

@node Irpc
@section @code{.irpc @var{symbol},@var{values}}@dots{}

@cindex @code{irpc} directive
Evaluate a sequence of statements assigning different values to @var{symbol}.
The sequence of statements starts at the @code{.irpc} directive, and is
terminated by an @code{.endr} directive.  For each character in @var{value},
@var{symbol} is set to the character, and the sequence of statements is
assembled.  If no @var{value} is listed, the sequence of statements is
assembled once, with @var{symbol} set to the null string.  To refer to
@var{symbol} within the sequence of statements, use @var{\symbol}.

For example, assembling

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

is equivalent to assembling

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

For some caveats with the spelling of @var{symbol}, see also the discussion
at @xref{Macro}.

@node Lcomm
@section @code{.lcomm @var{symbol} , @var{length}}

@cindex @code{lcomm} directive
@cindex local common symbols
@cindex symbols, local common
Reserve @var{length} (an absolute expression) bytes for a local common
denoted by @var{symbol}.  The section and value of @var{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.  @var{Symbol}
is not declared global (@pxref{Global,,@code{.global}}), so is normally
not visible to @code{@value{LD}}.

@ifset GENERIC
Some targets permit a third argument to be used with @code{.lcomm}.  This
argument specifies the desired alignment of the symbol in the bss section.
@end ifset

@ifset HPPA
The syntax for @code{.lcomm} differs slightly on the HPPA.  The syntax is
@samp{@var{symbol} .lcomm, @var{length}}; @var{symbol} is optional.
@end ifset

@node Lflags
@section @code{.lflags}

@cindex @code{lflags} directive (ignored)
@command{@value{AS}} accepts this directive, for compatibility with other
assemblers, but ignores it.

@ifclear no-line-dir
@node Line
@section @code{.line @var{line-number}}

@cindex @code{line} directive
@cindex logical line number
@ifset aout-bout
Change the logical line number.  @var{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 @var{line-number} @minus{} 1.  One day
@command{@value{AS}} will no longer support this directive: it is recognized only
for compatibility with existing assembler programs.
@end ifset

Even though this is a directive associated with the @code{a.out} or
@code{b.out} object-code formats, @command{@value{AS}} still recognizes it
when producing COFF output, and treats @samp{.line} as though it
were the COFF @samp{.ln} @emph{if} it is found outside a
@code{.def}/@code{.endef} pair.

Inside a @code{.def}, @samp{.line} is, instead, one of the directives
used by compilers to generate auxiliary symbol information for
debugging.
@end ifclear

@node Linkonce
@section @code{.linkonce [@var{type}]}
@cindex COMDAT
@cindex @code{linkonce} directive
@cindex common sections
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 @code{.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 @var{type} argument is optional.  If specified, it must be one of the
following strings.  For example:
@smallexample
.linkonce same_size
@end smallexample
Not all types may be supported on all object file formats.

@table @code
@item discard
Silently discard duplicate sections.  This is the default.

@item one_only
Warn if there are duplicate sections, but still keep only one copy.

@item same_size
Warn if any of the duplicates have different sizes.

@item same_contents
Warn if any of the duplicates do not have exactly the same contents.
@end table

@node List
@section @code{.list}

@cindex @code{list} directive
@cindex listing control, turning on
Control (in conjunction with the @code{.nolist} directive) whether or
not assembly listings are generated.  These two directives maintain an
internal counter (which is zero initially).   @code{.list} increments the
counter, and @code{.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
@samp{-a} command line option; @pxref{Invoking,,Command-Line Options}),
the initial value of the listing counter is one.

@node Ln
@section @code{.ln @var{line-number}}

@cindex @code{ln} directive
@ifclear no-line-dir
@samp{.ln} is a synonym for @samp{.line}.
@end ifclear
@ifset no-line-dir
Tell @command{@value{AS}} to change the logical line number.  @var{line-number}
must be an absolute expression.  The next line has that logical
line number, so any other statements on the current line (after a
statement separator character @code{;}) are reported as on logical
line number @var{line-number} @minus{} 1.
@ifset BOUT

This directive is accepted, but ignored, when @command{@value{AS}} is
configured for @code{b.out}; its effect is only associated with COFF
output format.
@end ifset
@end ifset

@node Loc
@section @code{.loc @var{fileno} @var{lineno} [@var{column}] [@var{options}]}
@cindex @code{loc} directive
When emitting DWARF2 line number information,
the @code{.loc} directive will add a row to the @code{.debug_line} line
number matrix corresponding to the immediately following assembly
instruction.  The @var{fileno}, @var{lineno}, and optional @var{column}
arguments will be applied to the @code{.debug_line} state machine before
the row is added.

The @var{options} are a sequence of the following tokens in any order:

@table @code
@item basic_block
This option will set the @code{basic_block} register in the
@code{.debug_line} state machine to @code{true}.

@item prologue_end
This option will set the @code{prologue_end} register in the
@code{.debug_line} state machine to @code{true}.

@item epilogue_begin
This option will set the @code{epilogue_begin} register in the
@code{.debug_line} state machine to @code{true}.

@item is_stmt @var{value}
This option will set the @code{is_stmt} register in the
@code{.debug_line} state machine to @code{value}, which must be 
either 0 or 1.

@item isa @var{value}
This directive will set the @code{isa} register in the @code{.debug_line}
state machine to @var{value}, which must be an unsigned integer.

@item discriminator @var{value}
This directive will set the @code{discriminator} register in the @code{.debug_line}
state machine to @var{value}, which must be an unsigned integer.

@end table

@node Loc_mark_labels
@section @code{.loc_mark_labels @var{enable}}
@cindex @code{loc_mark_labels} directive
When emitting DWARF2 line number information,
the @code{.loc_mark_labels} directive makes the assembler emit an entry
to the @code{.debug_line} line number matrix with the @code{basic_block}
register in the state machine set whenever a code label is seen.
The @var{enable} argument should be either 1 or 0, to enable or disable
this function respectively.

@ifset ELF
@node Local
@section @code{.local @var{names}}

@cindex @code{local} directive
This directive, which is available for ELF targets, marks each symbol in
the comma-separated list of @code{names} as a local symbol so that it
will not be externally visible.  If the symbols do not already exist,
they will be created.

For targets where the @code{.lcomm} directive (@pxref{Lcomm}) does not
accept an alignment argument, which is the case for most ELF targets,
the @code{.local} directive can be used in combination with @code{.comm}
(@pxref{Comm}) to define aligned local common data.
@end ifset

@node Long
@section @code{.long @var{expressions}}

@cindex @code{long} directive
@code{.long} is the same as @samp{.int}.  @xref{Int,,@code{.int}}.

@ignore
@c no one seems to know what this is for or whether this description is
@c what it really ought to do
@node Lsym
@section @code{.lsym @var{symbol}, @var{expression}}

@cindex @code{lsym} directive
@cindex symbol, not referenced in assembly
@code{.lsym} creates a new symbol named @var{symbol}, but does not put it in
the hash table, ensuring it cannot be referenced by name during the
rest of the assembly.  This sets the attributes of the symbol to be
the same as the expression value:
@smallexample
@var{other} = @var{descriptor} = 0
@var{type} = @r{(section of @var{expression})}
@var{value} = @var{expression}
@end smallexample
@noindent
The new symbol is not flagged as external.
@end ignore

@node Macro
@section @code{.macro}

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

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

@noindent
With that definition, @samp{SUM 0,5} is equivalent to this assembly input:

@example
        .long   0
        .long   1
        .long   2
        .long   3
        .long   4
        .long   5
@end example

@ftable @code
@item .macro @var{macname}
@itemx .macro @var{macname} @var{macargs} @dots{}
@cindex @code{macro} directive
Begin the definition of a macro called @var{macname}.  If your macro
definition requires arguments, specify their names after the macro name,
separated by commas or spaces.  You can qualify the macro argument to
indicate whether all invocations must specify a non-blank value (through
@samp{:@code{req}}), or whether it takes all of the remaining arguments
(through @samp{:@code{vararg}}).  You can supply a default value for any
macro argument by following the name with @samp{=@var{deflt}}.  You
cannot define two macros with the same @var{macname} unless it has been
subject to the @code{.purgem} directive (@pxref{Purgem}) between the two
definitions.  For example, these are all valid @code{.macro} statements:

@table @code
@item .macro comm
Begin the definition of a macro called @code{comm}, which takes no
arguments.

@item  .macro plus1 p, p1
@itemx .macro plus1 p p1
Either statement begins the definition of a macro called @code{plus1},
which takes two arguments; within the macro definition, write
@samp{\p} or @samp{\p1} to evaluate the arguments.

@item .macro reserve_str p1=0 p2
Begin the definition of a macro called @code{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
@samp{reserve_str @var{a},@var{b}} (with @samp{\p1} evaluating to
@var{a} and @samp{\p2} evaluating to @var{b}), or as @samp{reserve_str
,@var{b}} (with @samp{\p1} evaluating as the default, in this case
@samp{0}, and @samp{\p2} evaluating to @var{b}).

@item .macro m p1:req, p2=0, p3:vararg
Begin the definition of a macro called @code{m}, with at least three
arguments.  The first argument must always have a value specified, but
not the second, which instead has a default value. The third formal
will get assigned all remaining arguments specified at invocation time.

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

@end table

Note that since each of the @var{macargs} can be an identifier exactly
as any other one permitted by the target architecture, there may be
occasional problems if the target hand-crafts special meanings to certain
characters when they occur in a special position.  For example, if the colon
(@code{:}) is generally permitted to be part of a symbol name, but the
architecture specific code special-cases it when occurring as the final
character of a symbol (to denote a label), then the macro parameter
replacement code will have no way of knowing that and consider the whole
construct (including the colon) an identifier, and check only this
identifier for being the subject to parameter substitution.  So for example
this macro definition:

@example
	.macro label l
\l:
	.endm
@end example

might not work as expected.  Invoking @samp{label foo} might not create a label
called @samp{foo} but instead just insert the text @samp{\l:} into the
assembler source, probably generating an error about an unrecognised
identifier.

Similarly problems might occur with the period character (@samp{.})
which is often allowed inside opcode names (and hence identifier names).  So
for example constructing a macro to build an opcode from a base name and a
length specifier like this:

@example
	.macro opcode base length
        \base.\length
	.endm
@end example

and invoking it as @samp{opcode store l} will not create a @samp{store.l}
instruction but instead generate some kind of error as the assembler tries to
interpret the text @samp{\base.\length}.

There are several possible ways around this problem:

@table @code
@item Insert white space
If it is possible to use white space characters then this is the simplest
solution.  eg:

@example
	.macro label l
\l :
	.endm
@end example

@item Use @samp{\()}
The string @samp{\()} can be used to separate the end of a macro argument from
the following text.  eg:

@example
	.macro opcode base length
        \base\().\length
	.endm
@end example

@item Use the alternate macro syntax mode
In the alternative macro syntax mode the ampersand character (@samp{&}) can be
used as a separator.  eg:

@example
	.altmacro
	.macro label l
l&:
	.endm
@end example
@end table

Note: this problem of correctly identifying string parameters to pseudo ops
also applies to the identifiers used in @code{.irp} (@pxref{Irp}) 
and @code{.irpc} (@pxref{Irpc}) as well.

@item .endm
@cindex @code{endm} directive
Mark the end of a macro definition.

@item .exitm
@cindex @code{exitm} directive
Exit early from the current macro definition.

@cindex number of macros executed
@cindex macros, count executed
@item \@@
@command{@value{AS}} maintains a counter of how many macros it has
executed in this pseudo-variable; you can copy that number to your
output with @samp{\@@}, but @emph{only within a macro definition}.

@item LOCAL @var{name} [ , @dots{} ]
@emph{Warning: @code{LOCAL} is only available if you select ``alternate
macro syntax'' with @samp{--alternate} or @code{.altmacro}.}
@xref{Altmacro,,@code{.altmacro}}.
@end ftable

@node MRI
@section @code{.mri @var{val}}

@cindex @code{mri} directive
@cindex MRI mode, temporarily
If @var{val} is non-zero, this tells @command{@value{AS}} to enter MRI mode.  If
@var{val} is zero, this tells @command{@value{AS}} to exit MRI mode.  This change
affects code assembled until the next @code{.mri} directive, or until the end
of the file.  @xref{M, MRI mode, MRI mode}.

@node Noaltmacro
@section @code{.noaltmacro}
Disable alternate macro mode.  @xref{Altmacro}.

@node Nolist
@section @code{.nolist}

@cindex @code{nolist} directive
@cindex listing control, turning off
Control (in conjunction with the @code{.list} directive) whether or
not assembly listings are generated.  These two directives maintain an
internal counter (which is zero initially).   @code{.list} increments the
counter, and @code{.nolist} decrements it.  Assembly listings are
generated whenever the counter is greater than zero.

@node Octa
@section @code{.octa @var{bignums}}

@c FIXME: double size emitted for "octa" on i960, others?  Or warn?
@cindex @code{octa} directive
@cindex integer, 16-byte
@cindex sixteen byte integer
This directive expects zero or more bignums, separated by commas.  For each
bignum, it emits a 16-byte integer.

The term ``octa'' comes from contexts in which a ``word'' is two bytes;
hence @emph{octa}-word for 16 bytes.

@node Org
@section @code{.org @var{new-lc} , @var{fill}}

@cindex @code{org} directive
@cindex location counter, advancing
@cindex advancing location counter
@cindex current address, advancing
Advance the location counter of the current section to
@var{new-lc}.  @var{new-lc} is either an absolute expression or an
expression with the same section as the current subsection.  That is,
you can't use @code{.org} to cross sections: if @var{new-lc} has the
wrong section, the @code{.org} directive is ignored.  To be compatible
with former assemblers, if the section of @var{new-lc} is absolute,
@command{@value{AS}} issues a warning, then pretends the section of @var{new-lc}
is the same as the current subsection.

@code{.org} may only increase the location counter, or leave it
unchanged; you cannot use @code{.org} to move the location counter
backwards.

@c double negative used below "not undefined" because this is a specific
@c reference to "undefined" (as SEG_UNKNOWN is called in this manual)
@c section. doc@cygnus.com 18feb91
Because @command{@value{AS}} tries to assemble programs in one pass, @var{new-lc}
may not be undefined.  If you really detest this restriction we eagerly await
a chance to share your improved assembler.

Beware that the origin is relative to the start of the section, not
to the start of the subsection.  This is compatible with other
people's assemblers.

When the location counter (of the current subsection) is advanced, the
intervening bytes are filled with @var{fill} which should be an
absolute expression.  If the comma and @var{fill} are omitted,
@var{fill} defaults to zero.

@node P2align
@section @code{.p2align[wl] @var{abs-expr}, @var{abs-expr}, @var{abs-expr}}

@cindex padding the location counter given a power of two
@cindex @code{p2align} directive
Pad the location counter (in the current subsection) to a particular
storage boundary.  The first expression (which must be absolute) is the
number of low-order zero bits the location counter must have after
advancement.  For example @samp{.p2align 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.

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.

@cindex @code{p2alignw} directive
@cindex @code{p2alignl} directive
The @code{.p2alignw} and @code{.p2alignl} directives are variants of the
@code{.p2align} directive.  The @code{.p2alignw} directive treats the fill
pattern as a two byte word value.  The @code{.p2alignl} directives treats the
fill pattern as a four byte longword value.  For example, @code{.p2alignw
2,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.

@ifset ELF
@node PopSection
@section @code{.popsection}

@cindex @code{popsection} directive
@cindex Section Stack
This is one of the ELF section stack manipulation directives.  The others are
@code{.section} (@pxref{Section}), @code{.subsection} (@pxref{SubSection}), 
@code{.pushsection} (@pxref{PushSection}), and @code{.previous} 
(@pxref{Previous}).

This directive replaces the current section (and subsection) with the top
section (and subsection) on the section stack.  This section is popped off the
stack. 
@end ifset

@ifset ELF
@node Previous
@section @code{.previous}

@cindex @code{previous} directive
@cindex Section Stack
This is one of the ELF section stack manipulation directives.  The others are
@code{.section} (@pxref{Section}), @code{.subsection} (@pxref{SubSection}),
@code{.pushsection} (@pxref{PushSection}), and @code{.popsection}
(@pxref{PopSection}).

This directive swaps the current section (and subsection) with most recently
referenced section/subsection pair prior to this one.  Multiple
@code{.previous} directives in a row will flip between two sections (and their
subsections).  For example:

@smallexample
.section A
 .subsection 1
  .word 0x1234
 .subsection 2
  .word 0x5678
.previous
 .word 0x9abc
@end smallexample

Will place 0x1234 and 0x9abc into subsection 1 and 0x5678 into subsection 2 of
section A.  Whilst:

@smallexample
.section A
.subsection 1
  # Now in section A subsection 1
  .word 0x1234
.section B
.subsection 0
  # Now in section B subsection 0
  .word 0x5678
.subsection 1
  # Now in section B subsection 1
  .word 0x9abc
.previous
  # Now in section B subsection 0
  .word 0xdef0
@end smallexample

Will place 0x1234 into section A, 0x5678 and 0xdef0 into subsection 0 of
section B and 0x9abc into subsection 1 of section B.

In terms of the section stack, this directive swaps the current section with
the top section on the section stack.
@end ifset

@node Print
@section @code{.print @var{string}}

@cindex @code{print} directive
@command{@value{AS}} will print @var{string} on the standard output during
assembly.  You must put @var{string} in double quotes.

@ifset ELF
@node Protected
@section @code{.protected @var{names}}

@cindex @code{protected} directive
@cindex visibility
This is one of the ELF visibility directives.  The other two are
@code{.hidden} (@pxref{Hidden}) and @code{.internal} (@pxref{Internal}).

This directive overrides the named symbols default visibility (which is set by
their binding: local, global or weak).  The directive sets the visibility to
@code{protected} which means that any references to the symbols from within the
components that defines them must be resolved to the definition in that
component, even if a definition in another component would normally preempt
this. 
@end ifset

@node Psize
@section @code{.psize @var{lines} , @var{columns}}

@cindex @code{psize} directive
@cindex listing control: paper size
@cindex paper size, for listings
Use this directive to declare the number of lines---and, optionally, the
number of columns---to use for each page, when generating listings.

If you do not use @code{.psize}, listings use a default line-count
of 60.  You may omit the comma and @var{columns} specification; the
default width is 200 columns.

@command{@value{AS}} generates formfeeds whenever the specified number of
lines is exceeded (or whenever you explicitly request one, using
@code{.eject}).

If you specify @var{lines} as @code{0}, no formfeeds are generated save
those explicitly specified with @code{.eject}.

@node Purgem
@section @code{.purgem @var{name}}

@cindex @code{purgem} directive
Undefine the macro @var{name}, so that later uses of the string will not be
expanded.  @xref{Macro}.

@ifset ELF
@node PushSection
@section @code{.pushsection @var{name} [, @var{subsection}] [, "@var{flags}"[, @@@var{type}[,@var{arguments}]]]}

@cindex @code{pushsection} directive
@cindex Section Stack
This is one of the ELF section stack manipulation directives.  The others are
@code{.section} (@pxref{Section}), @code{.subsection} (@pxref{SubSection}), 
@code{.popsection} (@pxref{PopSection}), and @code{.previous} 
(@pxref{Previous}).

This directive pushes the current section (and subsection) onto the
top of the section stack, and then replaces the current section and
subsection with @code{name} and @code{subsection}. The optional
@code{flags}, @code{type} and @code{arguments} are treated the same
as in the @code{.section} (@pxref{Section}) directive.
@end ifset

@node Quad
@section @code{.quad @var{bignums}}

@cindex @code{quad} directive
@code{.quad} expects zero or more bignums, separated by commas.  For
each bignum, it emits
@ifclear bignum-16
an 8-byte integer.  If the bignum won't fit in 8 bytes, it prints a
warning message; and just takes the lowest order 8 bytes of the bignum.
@cindex eight-byte integer
@cindex integer, 8-byte

The term ``quad'' comes from contexts in which a ``word'' is two bytes;
hence @emph{quad}-word for 8 bytes.
@end ifclear
@ifset bignum-16
a 16-byte integer.  If the bignum won't fit in 16 bytes, it prints a
warning message; and just takes the lowest order 16 bytes of the bignum.
@cindex sixteen-byte integer
@cindex integer, 16-byte
@end ifset

@node Reloc
@section @code{.reloc @var{offset}, @var{reloc_name}[, @var{expression}]}

@cindex @code{reloc} directive
Generate a relocation at @var{offset} of type @var{reloc_name} with value
@var{expression}.  If @var{offset} is a number, the relocation is generated in
the current section.  If @var{offset} is an expression that resolves to a
symbol plus offset, the relocation is generated in the given symbol's section.
@var{expression}, if present, must resolve to a symbol plus addend or to an
absolute value, but note that not all targets support an addend.  e.g. ELF REL
targets such as i386 store an addend in the section contents rather than in the
relocation.  This low level interface does not support addends stored in the
section.

@node Rept
@section @code{.rept @var{count}}

@cindex @code{rept} directive
Repeat the sequence of lines between the @code{.rept} directive and the next
@code{.endr} directive @var{count} times.

For example, assembling

@example
        .rept   3
        .long   0
        .endr
@end example

is equivalent to assembling

@example
        .long   0
        .long   0
        .long   0
@end example

@node Sbttl
@section @code{.sbttl "@var{subheading}"}

@cindex @code{sbttl} directive
@cindex subtitles for listings
@cindex listing control: subtitle
Use @var{subheading} as the title (third line, immediately after the
title line) when generating assembly listings.

This directive affects subsequent pages, as well as the current page if
it appears within ten lines of the top of a page.

@ifset COFF
@node Scl
@section @code{.scl @var{class}}

@cindex @code{scl} directive
@cindex symbol storage class (COFF)
@cindex COFF symbol storage class
Set the storage-class value for a symbol.  This directive may only be
used inside a @code{.def}/@code{.endef} pair.  Storage class may flag
whether a symbol is static or external, or it may record further
symbolic debugging information.
@ifset BOUT

The @samp{.scl} directive is primarily associated with COFF output; when
configured to generate @code{b.out} output format, @command{@value{AS}}
accepts this directive but ignores it.
@end ifset
@end ifset

@ifset COFF-ELF
@node Section
@section @code{.section @var{name}}

@cindex named section
Use the @code{.section} directive to assemble the following code into a section
named @var{name}.

This directive is only supported for targets that actually support arbitrarily
named sections; on @code{a.out} targets, for example, it is not accepted, even
with a standard @code{a.out} section name.

@ifset COFF
@ifset ELF
@c only print the extra heading if both COFF and ELF are set
@subheading COFF Version
@end ifset

@cindex @code{section} directive (COFF version)
For COFF targets, the @code{.section} directive is used in one of the following
ways:

@smallexample
.section @var{name}[, "@var{flags}"]
.section @var{name}[, @var{subsection}]
@end smallexample

If the optional argument is quoted, it is taken as flags to use for the
section.  Each flag is a single character.  The following flags are recognized:
@table @code
@item b
bss section (uninitialized data)
@item n
section is not loaded
@item w
writable section
@item d
data section
@item r
read-only section
@item x
executable section
@item s
shared section (meaningful for PE targets)
@item a
ignored.  (For compatibility with the ELF version)
@item y
section is not readable (meaningful for PE targets)
@end table

If no flags are specified, the default flags depend upon the section name.  If
the section name is not recognized, the default will be for the section to be
loaded and writable.  Note the @code{n} and @code{w} flags remove attributes
from the section, rather than adding them, so if they are used on their own it
will be as if no flags had been specified at all.

If the optional argument to the @code{.section} directive is not quoted, it is
taken as a subsection number (@pxref{Sub-Sections}).
@end ifset

@ifset ELF
@ifset COFF
@c only print the extra heading if both COFF and ELF are set
@subheading ELF Version
@end ifset

@cindex Section Stack
This is one of the ELF section stack manipulation directives.  The others are
@code{.subsection} (@pxref{SubSection}), @code{.pushsection} 
(@pxref{PushSection}), @code{.popsection} (@pxref{PopSection}), and
@code{.previous} (@pxref{Previous}).

@cindex @code{section} directive (ELF version)
For ELF targets, the @code{.section} directive is used like this:

@smallexample
.section @var{name} [, "@var{flags}"[, @@@var{type}[,@var{flag_specific_arguments}]]]
@end smallexample

The optional @var{flags} argument is a quoted string which may contain any
combination of the following characters:
@table @code
@item a
section is allocatable
@item w
section is writable
@item x
section is executable
@item M
section is mergeable
@item S
section contains zero terminated strings
@item G
section is a member of a section group
@item T
section is used for thread-local-storage
@end table

The optional @var{type} argument may contain one of the following constants:
@table @code
@item @@progbits
section contains data
@item @@nobits
section does not contain data (i.e., section only occupies space)
@item @@note
section contains data which is used by things other than the program
@item @@init_array
section contains an array of pointers to init functions
@item @@fini_array
section contains an array of pointers to finish functions
@item @@preinit_array
section contains an array of pointers to pre-init functions
@end table

Many targets only support the first three section types.

Note on targets where the @code{@@} character is the start of a comment (eg
ARM) then another character is used instead.  For example the ARM port uses the
@code{%} character.

If @var{flags} contains the @code{M} symbol then the @var{type} argument must
be specified as well as an extra argument---@var{entsize}---like this:

@smallexample
.section @var{name} , "@var{flags}"M, @@@var{type}, @var{entsize}
@end smallexample

Sections with the @code{M} flag but not @code{S} flag must contain fixed size
constants, each @var{entsize} octets long. Sections with both @code{M} and
@code{S} must contain zero terminated strings where each character is
@var{entsize} bytes long. The linker may remove duplicates within sections with
the same name, same entity size and same flags.  @var{entsize} must be an
absolute expression.

If @var{flags} contains the @code{G} symbol then the @var{type} argument must
be present along with an additional field like this:

@smallexample
.section @var{name} , "@var{flags}"G, @@@var{type}, @var{GroupName}[, @var{linkage}]
@end smallexample

The @var{GroupName} field specifies the name of the section group to which this
particular section belongs.  The optional linkage field can contain:
@table @code
@item comdat
indicates that only one copy of this section should be retained
@item .gnu.linkonce
an alias for comdat
@end table

Note: if both the @var{M} and @var{G} flags are present then the fields for
the Merge flag should come first, like this:

@smallexample
.section @var{name} , "@var{flags}"MG, @@@var{type}, @var{entsize}, @var{GroupName}[, @var{linkage}]
@end smallexample

If no flags are specified, the default flags depend upon the section name.  If
the section name is not recognized, the default will be for the section to have
none of the above flags: it will not be allocated in memory, nor writable, nor
executable.  The section will contain data.

For ELF targets, the assembler supports another type of @code{.section}
directive for compatibility with the Solaris assembler:

@smallexample
.section "@var{name}"[, @var{flags}...]
@end smallexample

Note that the section name is quoted.  There may be a sequence of comma
separated flags:
@table @code
@item #alloc
section is allocatable
@item #write
section is writable
@item #execinstr
section is executable
@item #tls
section is used for thread local storage
@end table

This directive replaces the current section and subsection.  See the
contents of the gas testsuite directory @code{gas/testsuite/gas/elf} for
some examples of how this directive and the other section stack directives
work.
@end ifset
@end ifset

@node Set
@section @code{.set @var{symbol}, @var{expression}}

@cindex @code{set} directive
@cindex symbol value, setting
Set the value of @var{symbol} to @var{expression}.  This
changes @var{symbol}'s value and type to conform to
@var{expression}.  If @var{symbol} was flagged as external, it remains
flagged (@pxref{Symbol Attributes}).

You may @code{.set} a symbol many times in the same assembly.

If you @code{.set} a global symbol, the value stored in the object
file is the last value stored into it.

@ifset HPPA
The syntax for @code{set} on the HPPA is
@samp{@var{symbol} .set @var{expression}}.
@end ifset

@ifset Z80
On Z80 @code{set} is a real instruction, use
@samp{@var{symbol} defl @var{expression}} instead.
@end ifset

@node Short
@section @code{.short @var{expressions}}

@cindex @code{short} directive
@ifset GENERIC
@code{.short} is normally the same as @samp{.word}.
@xref{Word,,@code{.word}}.

In some configurations, however, @code{.short} and @code{.word} generate
numbers of different lengths.  @xref{Machine Dependencies}.
@end ifset
@ifclear GENERIC
@ifset W16
@code{.short} is the same as @samp{.word}.  @xref{Word,,@code{.word}}.
@end ifset
@ifset W32
This expects zero or more @var{expressions}, and emits
a 16 bit number for each.
@end ifset
@end ifclear

@node Single
@section @code{.single @var{flonums}}

@cindex @code{single} directive
@cindex floating point numbers (single)
This directive assembles zero or more flonums, separated by commas.  It
has the same effect as @code{.float}.
@ifset GENERIC
The exact kind of floating point numbers emitted depends on how
@command{@value{AS}} is configured.  @xref{Machine Dependencies}.
@end ifset
@ifclear GENERIC
@ifset IEEEFLOAT
On the @value{TARGET} family, @code{.single} emits 32-bit floating point
numbers in @sc{ieee} format.
@end ifset
@end ifclear

@ifset COFF-ELF
@node Size
@section @code{.size}

This directive is used to set the size associated with a symbol.

@ifset COFF
@ifset ELF
@c only print the extra heading if both COFF and ELF are set
@subheading COFF Version
@end ifset

@cindex @code{size} directive (COFF version)
For COFF targets, the @code{.size} directive is only permitted inside
@code{.def}/@code{.endef} pairs.  It is used like this:

@smallexample
.size @var{expression}
@end smallexample

@ifset BOUT
@samp{.size} is only meaningful when generating COFF format output; when
@command{@value{AS}} is generating @code{b.out}, it accepts this directive but
ignores it.
@end ifset
@end ifset

@ifset ELF
@ifset COFF
@c only print the extra heading if both COFF and ELF are set
@subheading ELF Version
@end ifset

@cindex @code{size} directive (ELF version)
For ELF targets, the @code{.size} directive is used like this:

@smallexample
.size @var{name} , @var{expression}
@end smallexample

This directive sets the size associated with a symbol @var{name}.
The size in bytes is computed from @var{expression} which can make use of label
arithmetic.  This directive is typically used to set the size of function
symbols.
@end ifset
@end ifset

@ifclear no-space-dir
@node Skip
@section @code{.skip @var{size} , @var{fill}}

@cindex @code{skip} directive
@cindex filling memory
This directive emits @var{size} bytes, each of value @var{fill}.  Both
@var{size} and @var{fill} are absolute expressions.  If the comma and
@var{fill} are omitted, @var{fill} is assumed to be zero.  This is the same as
@samp{.space}.
@end ifclear

@node Sleb128
@section @code{.sleb128 @var{expressions}}

@cindex @code{sleb128} directive
@var{sleb128} stands for ``signed little endian base 128.''  This is a 
compact, variable length representation of numbers used by the DWARF
symbolic debugging format.  @xref{Uleb128, ,@code{.uleb128}}.

@ifclear no-space-dir
@node Space
@section @code{.space @var{size} , @var{fill}}

@cindex @code{space} directive
@cindex filling memory
This directive emits @var{size} bytes, each of value @var{fill}.  Both
@var{size} and @var{fill} are absolute expressions.  If the comma
and @var{fill} are omitted, @var{fill} is assumed to be zero.  This is the same
as @samp{.skip}.

@ifset HPPA
@quotation
@emph{Warning:} @code{.space} has a completely different meaning for HPPA
targets; use @code{.block} as a substitute.  See @cite{HP9000 Series 800
Assembly Language Reference Manual} (HP 92432-90001) for the meaning of the
@code{.space} directive.  @xref{HPPA Directives,,HPPA Assembler Directives},
for a summary.
@end quotation
@end ifset
@end ifclear

@ifset have-stabs
@node Stab
@section @code{.stabd, .stabn, .stabs}

@cindex symbolic debuggers, information for
@cindex @code{stab@var{x}} directives
There are three directives that begin @samp{.stab}.
All emit symbols (@pxref{Symbols}), for use by symbolic debuggers.
The symbols are not entered in the @command{@value{AS}} hash table: they
cannot be referenced elsewhere in the source file.
Up to five fields are required:

@table @var
@item string
This is the symbol's name.  It may contain any character except
@samp{\000}, so is more general than ordinary symbol names.  Some
debuggers used to code arbitrarily complex structures into symbol names
using this field.

@item type
An absolute expression.  The symbol's type is set to the low 8 bits of
this expression.  Any bit pattern is permitted, but @code{@value{LD}}
and debuggers choke on silly bit patterns.

@item other
An absolute expression.  The symbol's ``other'' attribute is set to the
low 8 bits of this expression.

@item desc
An absolute expression.  The symbol's descriptor is set to the low 16
bits of this expression.

@item value
An absolute expression which becomes the symbol's value.
@end table

If a warning is detected while reading a @code{.stabd}, @code{.stabn},
or @code{.stabs} statement, the symbol has probably already been created;
you get a half-formed symbol in your object file.  This is
compatible with earlier assemblers!

@table @code
@cindex @code{stabd} directive
@item .stabd @var{type} , @var{other} , @var{desc}

The ``name'' of the symbol generated is not even an empty string.
It is a null pointer, for compatibility.  Older assemblers used a
null pointer so they didn't waste space in object files with empty
strings.

The symbol's value is set to the location counter,
relocatably.  When your program is linked, the value of this symbol
is the address of the location counter when the @code{.stabd} was
assembled.

@cindex @code{stabn} directive
@item .stabn @var{type} , @var{other} , @var{desc} , @var{value}
The name of the symbol is set to the empty string @code{""}.

@cindex @code{stabs} directive
@item .stabs @var{string} ,  @var{type} , @var{other} , @var{desc} , @var{value}
All five fields are specified.
@end table
@end ifset
@c end     have-stabs

@node String
@section @code{.string} "@var{str}", @code{.string8} "@var{str}", @code{.string16}
"@var{str}", @code{.string32} "@var{str}", @code{.string64} "@var{str}" 

@cindex string, copying to object file
@cindex string8, copying to object file
@cindex string16, copying to object file
@cindex string32, copying to object file
@cindex string64, copying to object file
@cindex @code{string} directive
@cindex @code{string8} directive
@cindex @code{string16} directive
@cindex @code{string32} directive
@cindex @code{string64} directive

Copy the characters in @var{str} to the object file.  You may specify more than
one string to copy, separated by commas.  Unless otherwise specified for a
particular machine, the assembler marks the end of each string with a 0 byte.
You can use any of the escape sequences described in @ref{Strings,,Strings}.

The variants @code{string16}, @code{string32} and @code{string64} differ from 
the @code{string} pseudo opcode in that each 8-bit character from @var{str} is
copied and expanded to 16, 32 or 64 bits respectively.  The expanded characters
are stored in target endianness byte order.

Example:
@smallexample
	.string32 "BYE"
expands to:
	.string   "B\0\0\0Y\0\0\0E\0\0\0"  /* On little endian targets.  */
	.string   "\0\0\0B\0\0\0Y\0\0\0E"  /* On big endian targets.  */
@end smallexample


@node Struct
@section @code{.struct @var{expression}}

@cindex @code{struct} directive
Switch to the absolute section, and set the section offset to @var{expression},
which must be an absolute expression.  You might use this as follows:
@smallexample
        .struct 0
field1:
        .struct field1 + 4
field2:
        .struct field2 + 4
field3:
@end smallexample
This would define the symbol @code{field1} to have the value 0, the symbol
@code{field2} to have the value 4, and the symbol @code{field3} to have the
value 8.  Assembly would be left in the absolute section, and you would need to
use a @code{.section} directive of some sort to change to some other section
before further assembly.

@ifset ELF
@node SubSection
@section @code{.subsection @var{name}}

@cindex @code{subsection} directive
@cindex Section Stack
This is one of the ELF section stack manipulation directives.  The others are
@code{.section} (@pxref{Section}), @code{.pushsection} (@pxref{PushSection}), 
@code{.popsection} (@pxref{PopSection}), and @code{.previous} 
(@pxref{Previous}).

This directive replaces the current subsection with @code{name}.  The current
section is not changed.  The replaced subsection is put onto the section stack
in place of the then current top of stack subsection.
@end ifset

@ifset ELF
@node Symver
@section @code{.symver}
@cindex @code{symver} directive
@cindex symbol versioning
@cindex versions of symbols
Use the @code{.symver} directive to bind symbols to specific version nodes
within a source file.  This is only supported on ELF platforms, and is
typically used when assembling files to be linked into a shared library.
There are cases where it may make sense to use this in objects to be bound
into an application itself so as to override a versioned symbol from a
shared library.

For ELF targets, the @code{.symver} directive can be used like this:
@smallexample
.symver @var{name}, @var{name2@@nodename}
@end smallexample
If the symbol @var{name} is defined within the file
being assembled, the @code{.symver} directive effectively creates a symbol
alias with the name @var{name2@@nodename}, and in fact the main reason that we
just don't try and create a regular alias is that the @var{@@} character isn't
permitted in symbol names.  The @var{name2} part of the name is the actual name
of the symbol by which it will be externally referenced.  The name @var{name}
itself is merely a name of convenience that is used so that it is possible to
have definitions for multiple versions of a function within a single source
file, and so that the compiler can unambiguously know which version of a
function is being mentioned.  The @var{nodename} portion of the alias should be
the name of a node specified in the version script supplied to the linker when
building a shared library.  If you are attempting to override a versioned
symbol from a shared library, then @var{nodename} should correspond to the
nodename of the symbol you are trying to override.

If the symbol @var{name} is not defined within the file being assembled, all
references to @var{name} will be changed to @var{name2@@nodename}.  If no
reference to @var{name} is made, @var{name2@@nodename} will be removed from the
symbol table.

Another usage of the @code{.symver} directive is:
@smallexample
.symver @var{name}, @var{name2@@@@nodename}
@end smallexample
In this case, the symbol @var{name} must exist and be defined within
the file being assembled. It is similar to @var{name2@@nodename}. The
difference is @var{name2@@@@nodename} will also be used to resolve
references to @var{name2} by the linker.

The third usage of the @code{.symver} directive is:
@smallexample
.symver @var{name}, @var{name2@@@@@@nodename}
@end smallexample
When @var{name} is not defined within the
file being assembled, it is treated as @var{name2@@nodename}. When
@var{name} is defined within the file being assembled, the symbol
name, @var{name}, will be changed to @var{name2@@@@nodename}.
@end ifset

@ifset COFF
@node Tag
@section @code{.tag @var{structname}}

@cindex COFF structure debugging
@cindex structure debugging, COFF
@cindex @code{tag} directive
This directive is generated by compilers to include auxiliary debugging
information in the symbol table.  It is only permitted inside
@code{.def}/@code{.endef} pairs.  Tags are used to link structure
definitions in the symbol table with instances of those structures.
@ifset BOUT

@samp{.tag} is only used when generating COFF format output; when
@command{@value{AS}} is generating @code{b.out}, it accepts this directive but
ignores it.
@end ifset
@end ifset

@node Text
@section @code{.text @var{subsection}}

@cindex @code{text} directive
Tells @command{@value{AS}} to assemble the following statements onto the end of
the text subsection numbered @var{subsection}, which is an absolute
expression.  If @var{subsection} is omitted, subsection number zero
is used.

@node Title
@section @code{.title "@var{heading}"}

@cindex @code{title} directive
@cindex listing control: title line
Use @var{heading} as the title (second line, immediately after the
source file name and pagenumber) when generating assembly listings.

This directive affects subsequent pages, as well as the current page if
it appears within ten lines of the top of a page.

@ifset COFF-ELF
@node Type
@section @code{.type}

This directive is used to set the type of a symbol.

@ifset COFF
@ifset ELF
@c only print the extra heading if both COFF and ELF are set
@subheading COFF Version
@end ifset

@cindex COFF symbol type
@cindex symbol type, COFF
@cindex @code{type} directive (COFF version)
For COFF targets, this directive is permitted only within
@code{.def}/@code{.endef} pairs.  It is used like this:

@smallexample
.type @var{int}
@end smallexample

This records the integer @var{int} as the type attribute of a symbol table
entry.

@ifset BOUT
@samp{.type} is associated only with COFF format output; when
@command{@value{AS}} is configured for @code{b.out} output, it accepts this
directive but ignores it.
@end ifset
@end ifset

@ifset ELF
@ifset COFF
@c only print the extra heading if both COFF and ELF are set
@subheading ELF Version
@end ifset

@cindex ELF symbol type
@cindex symbol type, ELF
@cindex @code{type} directive (ELF version)
For ELF targets, the @code{.type} directive is used like this:

@smallexample
.type @var{name} , @var{type description}
@end smallexample

This sets the type of symbol @var{name} to be either a
function symbol or an object symbol.  There are five different syntaxes
supported for the @var{type description} field, in order to provide
compatibility with various other assemblers.

Because some of the characters used in these syntaxes (such as @samp{@@} and
@samp{#}) are comment characters for some architectures, some of the syntaxes
below do not work on all architectures.  The first variant will be accepted by
the GNU assembler on all architectures so that variant should be used for
maximum portability, if you do not need to assemble your code with other
assemblers.

The syntaxes supported are:

@smallexample
  .type <name> STT_<TYPE_IN_UPPER_CASE>
  .type <name>,#<type>
  .type <name>,@@<type>
  .type <name>,%<type>
  .type <name>,"<type>"
@end smallexample

The types supported are:

@table @gcctabopt
@item STT_FUNC
@itemx function
Mark the symbol as being a function name.

@item STT_GNU_IFUNC
@itemx gnu_indirect_function
Mark the symbol as an indirect function when evaluated during reloc
processing.  (This is only supported on Linux targeted assemblers).

@item STT_OBJECT
@itemx object
Mark the symbol as being a data object.

@item STT_TLS
@itemx tls_object
Mark the symbol as being a thead-local data object.

@item STT_COMMON
@itemx common
Mark the symbol as being a common data object.

@item STT_NOTYPE
@itemx notype
Does not mark the symbol in any way.  It is supported just for completeness.

@end table

Note: Some targets support extra types in addition to those listed above.

@end ifset
@end ifset

@node Uleb128
@section @code{.uleb128 @var{expressions}}

@cindex @code{uleb128} directive
@var{uleb128} stands for ``unsigned little endian base 128.''  This is a 
compact, variable length representation of numbers used by the DWARF
symbolic debugging format.  @xref{Sleb128, ,@code{.sleb128}}.

@ifset COFF
@node Val
@section @code{.val @var{addr}}

@cindex @code{val} directive
@cindex COFF value attribute
@cindex value attribute, COFF
This directive, permitted only within @code{.def}/@code{.endef} pairs,
records the address @var{addr} as the value attribute of a symbol table
entry.
@ifset BOUT

@samp{.val} is used only for COFF output; when @command{@value{AS}} is
configured for @code{b.out}, it accepts this directive but ignores it.
@end ifset
@end ifset

@ifset ELF
@node Version
@section @code{.version "@var{string}"}

@cindex @code{version} directive
This directive creates a @code{.note} section and places into it an ELF
formatted note of type NT_VERSION.  The note's name is set to @code{string}.
@end ifset

@ifset ELF
@node VTableEntry
@section @code{.vtable_entry @var{table}, @var{offset}}

@cindex @code{vtable_entry} directive
This directive finds or creates a symbol @code{table} and creates a
@code{VTABLE_ENTRY} relocation for it with an addend of @code{offset}.

@node VTableInherit
@section @code{.vtable_inherit @var{child}, @var{parent}}

@cindex @code{vtable_inherit} directive
This directive finds the symbol @code{child} and finds or creates the symbol
@code{parent} and then creates a @code{VTABLE_INHERIT} relocation for the
parent whose addend is the value of the child symbol.  As a special case the
parent name of @code{0} is treated as referring to the @code{*ABS*} section.
@end ifset

@node Warning
@section @code{.warning "@var{string}"}
@cindex warning directive
Similar to the directive @code{.error}
(@pxref{Error,,@code{.error "@var{string}"}}), but just emits a warning.

@node Weak
@section @code{.weak @var{names}}

@cindex @code{weak} directive
This directive sets the weak attribute on the comma separated list of symbol
@code{names}.  If the symbols do not already exist, they will be created.

On COFF targets other than PE, weak symbols are a GNU extension.  This 
directive sets the weak attribute on the comma separated list of symbol
@code{names}.  If the symbols do not already exist, they will be created.

On the PE target, weak symbols are supported natively as weak aliases.
When a weak symbol is created that is not an alias, GAS creates an 
alternate symbol to hold the default value.

@node Weakref
@section @code{.weakref @var{alias}, @var{target}}

@cindex @code{weakref} directive
This directive creates an alias to the target symbol that enables the symbol to
be referenced with weak-symbol semantics, but without actually making it weak.
If direct references or definitions of the symbol are present, then the symbol
will not be weak, but if all references to it are through weak references, the
symbol will be marked as weak in the symbol table.

The effect is equivalent to moving all references to the alias to a separate
assembly source file, renaming the alias to the symbol in it, declaring the
symbol as weak there, and running a reloadable link to merge the object files
resulting from the assembly of the new source file and the old source file that
had the references to the alias removed.

The alias itself never makes to the symbol table, and is entirely handled
within the assembler.

@node Word
@section @code{.word @var{expressions}}

@cindex @code{word} directive
This directive expects zero or more @var{expressions}, of any section,
separated by commas.
@ifclear GENERIC
@ifset W32
For each expression, @command{@value{AS}} emits a 32-bit number.
@end ifset
@ifset W16
For each expression, @command{@value{AS}} emits a 16-bit number.
@end ifset
@end ifclear
@ifset GENERIC

The size of the number emitted, and its byte order,
depend on what target computer the assembly is for.
@end ifset

@c on amd29k, i960, sparc the "special treatment to support compilers" doesn't
@c happen---32-bit addressability, period; no long/short jumps.
@ifset DIFF-TBL-KLUGE
@cindex difference tables altered
@cindex altered difference tables
@quotation
@emph{Warning: Special Treatment to support Compilers}
@end quotation

@ifset GENERIC
Machines with a 32-bit address space, but that do less than 32-bit
addressing, require the following special treatment.  If the machine of
interest to you does 32-bit addressing (or doesn't require it;
@pxref{Machine Dependencies}), you can ignore this issue.

@end ifset
In order to assemble compiler output into something that works,
@command{@value{AS}} occasionally does strange things to @samp{.word} directives.
Directives of the form @samp{.word sym1-sym2} are often emitted by
compilers as part of jump tables.  Therefore, when @command{@value{AS}} assembles a
directive of the form @samp{.word sym1-sym2}, and the difference between
@code{sym1} and @code{sym2} does not fit in 16 bits, @command{@value{AS}}
creates a @dfn{secondary jump table}, immediately before the next label.
This secondary jump table is preceded by a short-jump to the
first byte after the secondary table.  This short-jump prevents the flow
of control from accidentally falling into the new table.  Inside the
table is a long-jump to @code{sym2}.  The original @samp{.word}
contains @code{sym1} minus the address of the long-jump to
@code{sym2}.

If there were several occurrences of @samp{.word sym1-sym2} before the
secondary jump table, all of them are adjusted.  If there was a
@samp{.word sym3-sym4}, that also did not fit in sixteen bits, a
long-jump to @code{sym4} is included in the secondary jump table,
and the @code{.word} directives are adjusted to contain @code{sym3}
minus the address of the long-jump to @code{sym4}; and so on, for as many
entries in the original jump table as necessary.

@ifset INTERNALS
@emph{This feature may be disabled by compiling @command{@value{AS}} with the
@samp{-DWORKING_DOT_WORD} option.} This feature is likely to confuse
assembly language programmers.
@end ifset
@end ifset
@c end     DIFF-TBL-KLUGE

@node Deprecated
@section Deprecated Directives

@cindex deprecated directives
@cindex obsolescent directives
One day these directives won't work.
They are included for compatibility with older assemblers.
@table @t
@item .abort
@item .line
@end table

@ifset ELF
@node Object Attributes
@chapter Object Attributes
@cindex object attributes

@command{@value{AS}} assembles source files written for a specific architecture
into object files for that architecture.  But not all object files are alike.
Many architectures support incompatible variations.  For instance, floating
point arguments might be passed in floating point registers if the object file
requires hardware floating point support---or floating point arguments might be
passed in integer registers if the object file supports processors with no
hardware floating point unit.  Or, if two objects are built for different
generations of the same architecture, the combination may require the
newer generation at run-time.

This information is useful during and after linking.  At link time,
@command{@value{LD}} can warn about incompatible object files.  After link
time, tools like @command{gdb} can use it to process the linked file
correctly.

Compatibility information is recorded as a series of object attributes.  Each
attribute has a @dfn{vendor}, @dfn{tag}, and @dfn{value}.  The vendor is a
string, and indicates who sets the meaning of the tag.  The tag is an integer,
and indicates what property the attribute describes.  The value may be a string
or an integer, and indicates how the property affects this object.  Missing
attributes are the same as attributes with a zero value or empty string value.

Object attributes were developed as part of the ABI for the ARM Architecture.
The file format is documented in @cite{ELF for the ARM Architecture}.

@menu
* GNU Object Attributes::               @sc{gnu} Object Attributes
* Defining New Object Attributes::      Defining New Object Attributes
@end menu

@node GNU Object Attributes
@section @sc{gnu} Object Attributes

The @code{.gnu_attribute} directive records an object attribute
with vendor @samp{gnu}.

Except for @samp{Tag_compatibility}, which has both an integer and a string for
its value, @sc{gnu} attributes have a string value if the tag number is odd and
an integer value if the tag number is even.  The second bit (@code{@var{tag} &
2} is set for architecture-independent attributes and clear for
architecture-dependent ones.

@subsection Common @sc{gnu} attributes

These attributes are valid on all architectures.

@table @r
@item Tag_compatibility (32)
The compatibility attribute takes an integer flag value and a vendor name.  If
the flag value is 0, the file is compatible with other toolchains.  If it is 1,
then the file is only compatible with the named toolchain.  If it is greater
than 1, the file can only be processed by other toolchains under some private
arrangement indicated by the flag value and the vendor name.
@end table

@subsection MIPS Attributes

@table @r
@item Tag_GNU_MIPS_ABI_FP (4)
The floating-point ABI used by this object file.  The value will be:

@itemize @bullet
@item
0 for files not affected by the floating-point ABI.
@item
1 for files using the hardware floating-point with a standard double-precision
FPU.
@item
2 for files using the hardware floating-point ABI with a single-precision FPU.
@item
3 for files using the software floating-point ABI.
@item
4 for files using the hardware floating-point ABI with 64-bit wide
double-precision floating-point registers and 32-bit wide general
purpose registers.
@end itemize
@end table

@subsection PowerPC Attributes

@table @r
@item Tag_GNU_Power_ABI_FP (4)
The floating-point ABI used by this object file.  The value will be:

@itemize @bullet
@item
0 for files not affected by the floating-point ABI.
@item
1 for files using double-precision hardware floating-point ABI.
@item
2 for files using the software floating-point ABI.
@item
3 for files using single-precision hardware floating-point ABI.
@end itemize

@item Tag_GNU_Power_ABI_Vector (8)
The vector ABI used by this object file.  The value will be:

@itemize @bullet
@item
0 for files not affected by the vector ABI.
@item
1 for files using general purpose registers to pass vectors.
@item
2 for files using AltiVec registers to pass vectors.
@item
3 for files using SPE registers to pass vectors.
@end itemize
@end table

@node Defining New Object Attributes
@section Defining New Object Attributes

If you want to define a new @sc{gnu} object attribute, here are the places you
will need to modify.  New attributes should be discussed on the @samp{binutils}
mailing list.

@itemize @bullet
@item
This manual, which is the official register of attributes.
@item
The header for your architecture @file{include/elf}, to define the tag.
@item
The @file{bfd} support file for your architecture, to merge the attribute
and issue any appropriate link warnings.
@item
Test cases in @file{ld/testsuite} for merging and link warnings.
@item
@file{binutils/readelf.c} to display your attribute.
@item
GCC, if you want the compiler to mark the attribute automatically.
@end itemize

@end ifset

@ifset GENERIC
@node Machine Dependencies
@chapter Machine Dependent Features

@cindex machine dependencies
The machine instruction sets are (almost by definition) different on
each machine where @command{@value{AS}} runs.  Floating point representations
vary as well, and @command{@value{AS}} often supports a few additional
directives or command-line options for compatibility with other
assemblers on a particular platform.  Finally, some versions of
@command{@value{AS}} support special pseudo-instructions for branch
optimization.

This chapter discusses most of these differences, though it does not
include details on any machine's instruction set.  For details on that
subject, see the hardware manufacturer's manual.

@menu
@ifset ALPHA
* Alpha-Dependent::		Alpha Dependent Features
@end ifset
@ifset ARC
* ARC-Dependent::               ARC Dependent Features
@end ifset
@ifset ARM
* ARM-Dependent::               ARM Dependent Features
@end ifset
@ifset AVR
* AVR-Dependent::               AVR Dependent Features
@end ifset
@ifset BFIN
* BFIN-Dependent::		BFIN Dependent Features
@end ifset
@ifset CR16
* CR16-Dependent::              CR16 Dependent Features
@end ifset
@ifset CRIS
* CRIS-Dependent::              CRIS Dependent Features
@end ifset
@ifset D10V
* D10V-Dependent::              D10V Dependent Features
@end ifset
@ifset D30V
* D30V-Dependent::              D30V Dependent Features
@end ifset
@ifset H8/300
* H8/300-Dependent::            Renesas H8/300 Dependent Features
@end ifset
@ifset HPPA
* HPPA-Dependent::              HPPA Dependent Features
@end ifset
@ifset I370
* ESA/390-Dependent::           IBM ESA/390 Dependent Features
@end ifset
@ifset I80386
* i386-Dependent::              Intel 80386 and AMD x86-64 Dependent Features
@end ifset
@ifset I860
* i860-Dependent::              Intel 80860 Dependent Features
@end ifset
@ifset I960
* i960-Dependent::              Intel 80960 Dependent Features
@end ifset
@ifset IA64
* IA-64-Dependent::             Intel IA-64 Dependent Features
@end ifset
@ifset IP2K
* IP2K-Dependent::              IP2K Dependent Features
@end ifset
@ifset LM32
* LM32-Dependent::              LM32 Dependent Features
@end ifset
@ifset M32C
* M32C-Dependent::              M32C Dependent Features
@end ifset
@ifset M32R
* M32R-Dependent::              M32R Dependent Features
@end ifset
@ifset M680X0
* M68K-Dependent::              M680x0 Dependent Features
@end ifset
@ifset M68HC11
* M68HC11-Dependent::           M68HC11 and 68HC12 Dependent Features
@end ifset
@ifset MIPS
* MIPS-Dependent::              MIPS Dependent Features
@end ifset
@ifset MMIX
* MMIX-Dependent::              MMIX Dependent Features
@end ifset
@ifset MSP430
* MSP430-Dependent::		MSP430 Dependent Features
@end ifset
@ifset SH
* SH-Dependent::                Renesas / SuperH SH Dependent Features
* SH64-Dependent::              SuperH SH64 Dependent Features
@end ifset
@ifset PDP11
* PDP-11-Dependent::            PDP-11 Dependent Features
@end ifset
@ifset PJ
* PJ-Dependent::                picoJava Dependent Features
@end ifset
@ifset PPC
* PPC-Dependent::               PowerPC Dependent Features
@end ifset
@ifset S390
* S/390-Dependent::             IBM S/390 Dependent Features
@end ifset
@ifset SCORE
* SCORE-Dependent::             SCORE Dependent Features
@end ifset
@ifset SPARC
* Sparc-Dependent::             SPARC Dependent Features
@end ifset
@ifset TIC54X
* TIC54X-Dependent::            TI TMS320C54x Dependent Features
@end ifset
@ifset V850
* V850-Dependent::              V850 Dependent Features
@end ifset
@ifset XTENSA
* Xtensa-Dependent::            Xtensa Dependent Features
@end ifset
@ifset Z80
* Z80-Dependent::               Z80 Dependent Features
@end ifset
@ifset Z8000
* Z8000-Dependent::             Z8000 Dependent Features
@end ifset
@ifset VAX
* Vax-Dependent::               VAX Dependent Features
@end ifset
@end menu

@lowersections
@end ifset

@c The following major nodes are *sections* in the GENERIC version, *chapters*
@c in single-cpu versions.  This is mainly achieved by @lowersections.  There is a
@c peculiarity: to preserve cross-references, there must be a node called
@c "Machine Dependencies".  Hence the conditional nodenames in each
@c major node below.  Node defaulting in makeinfo requires adjacency of
@c node and sectioning commands; hence the repetition of @chapter BLAH
@c in both conditional blocks.

@ifset ALPHA
@include c-alpha.texi
@end ifset

@ifset ARC
@include c-arc.texi
@end ifset

@ifset ARM
@include c-arm.texi
@end ifset

@ifset AVR
@include c-avr.texi
@end ifset

@ifset BFIN
@include c-bfin.texi
@end ifset

@ifset CR16
@include c-cr16.texi
@end ifset

@ifset CRIS
@include c-cris.texi
@end ifset

@ifset Renesas-all
@ifclear GENERIC
@node Machine Dependencies
@chapter Machine Dependent Features

The machine instruction sets are different on each Renesas chip family,
and there are also some syntax differences among the families.  This
chapter describes the specific @command{@value{AS}} features for each
family.

@menu
* H8/300-Dependent::            Renesas H8/300 Dependent Features
* SH-Dependent::                Renesas SH Dependent Features
@end menu
@lowersections
@end ifclear
@end ifset

@ifset D10V
@include c-d10v.texi
@end ifset

@ifset D30V
@include c-d30v.texi
@end ifset

@ifset H8/300
@include c-h8300.texi
@end ifset

@ifset HPPA
@include c-hppa.texi
@end ifset

@ifset I370
@include c-i370.texi
@end ifset

@ifset I80386
@include c-i386.texi
@end ifset

@ifset I860
@include c-i860.texi
@end ifset

@ifset I960
@include c-i960.texi
@end ifset

@ifset IA64
@include c-ia64.texi
@end ifset

@ifset IP2K
@include c-ip2k.texi
@end ifset

@ifset LM32
@include c-lm32.texi
@end ifset

@ifset M32C
@include c-m32c.texi
@end ifset

@ifset M32R
@include c-m32r.texi
@end ifset

@ifset M680X0
@include c-m68k.texi
@end ifset

@ifset M68HC11
@include c-m68hc11.texi
@end ifset

@ifset MIPS
@include c-mips.texi
@end ifset

@ifset MMIX
@include c-mmix.texi
@end ifset

@ifset MSP430
@include c-msp430.texi
@end ifset

@ifset NS32K
@include c-ns32k.texi
@end ifset

@ifset PDP11
@include c-pdp11.texi
@end ifset

@ifset PJ
@include c-pj.texi
@end ifset

@ifset PPC
@include c-ppc.texi
@end ifset

@ifset S390
@include c-s390.texi
@end ifset

@ifset SCORE
@include c-score.texi
@end ifset

@ifset SH
@include c-sh.texi
@include c-sh64.texi
@end ifset

@ifset SPARC
@include c-sparc.texi
@end ifset

@ifset TIC54X
@include c-tic54x.texi
@end ifset

@ifset Z80
@include c-z80.texi
@end ifset

@ifset Z8000
@include c-z8k.texi
@end ifset

@ifset VAX
@include c-vax.texi
@end ifset

@ifset V850
@include c-v850.texi
@end ifset

@ifset XTENSA
@include c-xtensa.texi
@end ifset

@ifset GENERIC
@c reverse effect of @down at top of generic Machine-Dep chapter
@raisesections
@end ifset

@node Reporting Bugs
@chapter Reporting Bugs
@cindex bugs in assembler
@cindex reporting bugs in assembler

Your bug reports play an essential role in making @command{@value{AS}} reliable.

Reporting a bug may help you by bringing a solution to your problem, or it may
not.  But in any case the principal function of a bug report is to help the
entire community by making the next version of @command{@value{AS}} work better.
Bug reports are your contribution to the maintenance of @command{@value{AS}}.

In order for a bug report to serve its purpose, you must include the
information that enables us to fix the bug.

@menu
* Bug Criteria::                Have you found a bug?
* Bug Reporting::               How to report bugs
@end menu

@node Bug Criteria
@section Have You Found a Bug?
@cindex bug criteria

If you are not sure whether you have found a bug, here are some guidelines:

@itemize @bullet
@cindex fatal signal
@cindex assembler crash
@cindex crash of assembler
@item
If the assembler gets a fatal signal, for any input whatever, that is a
@command{@value{AS}} bug.  Reliable assemblers never crash.

@cindex error on valid input
@item
If @command{@value{AS}} produces an error message for valid input, that is a bug.

@cindex invalid input
@item
If @command{@value{AS}} does not produce an error message for invalid input, that
is a bug.  However, you should note that your idea of ``invalid input'' might
be our idea of ``an extension'' or ``support for traditional practice''.

@item
If you are an experienced user of assemblers, your suggestions for improvement
of @command{@value{AS}} are welcome in any case.
@end itemize

@node Bug Reporting
@section How to Report Bugs
@cindex bug reports
@cindex assembler bugs, reporting

A number of companies and individuals offer support for @sc{gnu} products.  If
you obtained @command{@value{AS}} from a support organization, we recommend you
contact that organization first.

You can find contact information for many support companies and
individuals in the file @file{etc/SERVICE} in the @sc{gnu} Emacs
distribution.

@ifset BUGURL
In any event, we also recommend that you send bug reports for @command{@value{AS}}
to @value{BUGURL}.
@end ifset

The fundamental principle of reporting bugs usefully is this:
@strong{report all the facts}.  If you are not sure whether to state a
fact or leave it out, state it!

Often people omit facts because they think they know what causes the problem
and assume that some details do not matter.  Thus, you might assume that the
name of a symbol you use in an example does not matter.  Well, probably it does
not, but one cannot be sure.  Perhaps the bug is a stray memory reference which
happens to fetch from the location where that name is stored in memory;
perhaps, if the name were different, the contents of that location would fool
the assembler into doing the right thing despite the bug.  Play it safe and
give a specific, complete example.  That is the easiest thing for you to do,
and the most helpful.

Keep in mind that the purpose of a bug report is to enable us to fix the bug if
it is new to us.  Therefore, always write your bug reports on the assumption
that the bug has not been reported previously.

Sometimes people give a few sketchy facts and ask, ``Does this ring a
bell?''  This cannot help us fix a bug, so it is basically useless.  We
respond by asking for enough details to enable us to investigate.
You might as well expedite matters by sending them to begin with.

To enable us to fix the bug, you should include all these things:

@itemize @bullet
@item
The version of @command{@value{AS}}.  @command{@value{AS}} announces it if you start
it with the @samp{--version} argument.

Without this, we will not know whether there is any point in looking for
the bug in the current version of @command{@value{AS}}.

@item
Any patches you may have applied to the @command{@value{AS}} source.

@item
The type of machine you are using, and the operating system name and
version number.

@item
What compiler (and its version) was used to compile @command{@value{AS}}---e.g.
``@code{gcc-2.7}''.

@item
The command arguments you gave the assembler to assemble your example and
observe the bug.  To guarantee you will not omit something important, list them
all.  A copy of the Makefile (or the output from make) is sufficient.

If we were to try to guess the arguments, we would probably guess wrong
and then we might not encounter the bug.

@item
A complete input file that will reproduce the bug.  If the bug is observed when
the assembler is invoked via a compiler, send the assembler source, not the
high level language source.  Most compilers will produce the assembler source
when run with the @samp{-S} option.  If you are using @code{@value{GCC}}, use
the options @samp{-v --save-temps}; this will save the assembler source in a
file with an extension of @file{.s}, and also show you exactly how
@command{@value{AS}} is being run.

@item
A description of what behavior you observe that you believe is
incorrect.  For example, ``It gets a fatal signal.''

Of course, if the bug is that @command{@value{AS}} gets a fatal signal, then we
will certainly notice it.  But if the bug is incorrect output, we might not
notice unless it is glaringly wrong.  You might as well not give us a chance to
make a mistake.

Even if the problem you experience is a fatal signal, you should still say so
explicitly.  Suppose something strange is going on, such as, your copy of
@command{@value{AS}} is out of sync, or you have encountered a bug in the C
library on your system.  (This has happened!)  Your copy might crash and ours
would not.  If you told us to expect a crash, then when ours fails to crash, we
would know that the bug was not happening for us.  If you had not told us to
expect a crash, then we would not be able to draw any conclusion from our
observations.

@item
If you wish to suggest changes to the @command{@value{AS}} source, send us context
diffs, as generated by @code{diff} with the @samp{-u}, @samp{-c}, or @samp{-p}
option.  Always send diffs from the old file to the new file.  If you even
discuss something in the @command{@value{AS}} source, refer to it by context, not
by line number.

The line numbers in our development sources will not match those in your
sources.  Your line numbers would convey no useful information to us.
@end itemize

Here are some things that are not necessary:

@itemize @bullet
@item
A description of the envelope of the bug.

Often people who encounter a bug spend a lot of time investigating
which changes to the input file will make the bug go away and which
changes will not affect it.

This is often time consuming and not very useful, because the way we
will find the bug is by running a single example under the debugger
with breakpoints, not by pure deduction from a series of examples.
We recommend that you save your time for something else.

Of course, if you can find a simpler example to report @emph{instead}
of the original one, that is a convenience for us.  Errors in the
output will be easier to spot, running under the debugger will take
less time, and so on.

However, simplification is not vital; if you do not want to do this,
report the bug anyway and send us the entire test case you used.

@item
A patch for the bug.

A patch for the bug does help us if it is a good one.  But do not omit
the necessary information, such as the test case, on the assumption that
a patch is all we need.  We might see problems with your patch and decide
to fix the problem another way, or we might not understand it at all.

Sometimes with a program as complicated as @command{@value{AS}} it is very hard to
construct an example that will make the program follow a certain path through
the code.  If you do not send us the example, we will not be able to construct
one, so we will not be able to verify that the bug is fixed.

And if we cannot understand what bug you are trying to fix, or why your
patch should be an improvement, we will not install it.  A test case will
help us to understand.

@item
A guess about what the bug is or what it depends on.

Such guesses are usually wrong.  Even we cannot guess right about such
things without first using the debugger to find the facts.
@end itemize

@node Acknowledgements
@chapter Acknowledgements

If you have contributed to GAS and your name isn't listed here,
it is not meant as a slight.  We just don't know about it.  Send mail to the
maintainer, and we'll correct the situation.  Currently 
@c (January 1994), 
the maintainer is Ken Raeburn (email address @code{raeburn@@cygnus.com}).

Dean Elsner wrote the original @sc{gnu} assembler for the VAX.@footnote{Any
more details?}

Jay Fenlason maintained GAS for a while, adding support for GDB-specific debug
information and the 68k series machines, most of the preprocessing pass, and
extensive changes in @file{messages.c}, @file{input-file.c}, @file{write.c}.

K. Richard Pixley maintained GAS for a while, adding various enhancements and
many bug fixes, including merging support for several processors, breaking GAS
up to handle multiple object file format back ends (including heavy rewrite,
testing, an integration of the coff and b.out back ends), adding configuration
including heavy testing and verification of cross assemblers and file splits
and renaming, converted GAS to strictly ANSI C including full prototypes, added
support for m680[34]0 and cpu32, did considerable work on i960 including a COFF
port (including considerable amounts of reverse engineering), a SPARC opcode
file rewrite, DECstation, rs6000, and hp300hpux host ports, updated ``know''
assertions and made them work, much other reorganization, cleanup, and lint.

Ken Raeburn wrote the high-level BFD interface code to replace most of the code
in format-specific I/O modules.

The original VMS support was contributed by David L. Kashtan.  Eric Youngdale
has done much work with it since.

The Intel 80386 machine description was written by Eliot Dresselhaus.

Minh Tran-Le at IntelliCorp contributed some AIX 386 support.

The Motorola 88k machine description was contributed by Devon Bowen of Buffalo
University and Torbjorn Granlund of the Swedish Institute of Computer Science.

Keith Knowles at the Open Software Foundation wrote the original MIPS back end
(@file{tc-mips.c}, @file{tc-mips.h}), and contributed Rose format support
(which hasn't been merged in yet).  Ralph Campbell worked with the MIPS code to
support a.out format.

Support for the Zilog Z8k and Renesas H8/300 processors (tc-z8k,
tc-h8300), and IEEE 695 object file format (obj-ieee), was written by
Steve Chamberlain of Cygnus Support.  Steve also modified the COFF back end to
use BFD for some low-level operations, for use with the H8/300 and AMD 29k
targets.

John Gilmore built the AMD 29000 support, added @code{.include} support, and
simplified the configuration of which versions accept which directives.  He
updated the 68k machine description so that Motorola's opcodes always produced
fixed-size instructions (e.g., @code{jsr}), while synthetic instructions
remained shrinkable (@code{jbsr}).  John fixed many bugs, including true tested
cross-compilation support, and one bug in relaxation that took a week and
required the proverbial one-bit fix.

Ian Lance Taylor of Cygnus Support merged the Motorola and MIT syntax for the
68k, completed support for some COFF targets (68k, i386 SVR3, and SCO Unix),
added support for MIPS ECOFF and ELF targets, wrote the initial RS/6000 and
PowerPC assembler, and made a few other minor patches.

Steve Chamberlain made GAS able to generate listings.

Hewlett-Packard contributed support for the HP9000/300.

Jeff Law wrote GAS and BFD support for the native HPPA object format (SOM)
along with a fairly extensive HPPA testsuite (for both SOM and ELF object
formats).  This work was supported by both the Center for Software Science at
the University of Utah and Cygnus Support.

Support for ELF format files has been worked on by Mark Eichin of Cygnus
Support (original, incomplete implementation for SPARC), Pete Hoogenboom and
Jeff Law at the University of Utah (HPPA mainly), Michael Meissner of the Open
Software Foundation (i386 mainly), and Ken Raeburn of Cygnus Support (sparc,
and some initial 64-bit support).

Linas Vepstas added GAS support for the ESA/390 ``IBM 370'' architecture.

Richard Henderson rewrote the Alpha assembler. Klaus Kaempf wrote GAS and BFD
support for openVMS/Alpha.

Timothy Wall, Michael Hayes, and Greg Smart contributed to the various tic*
flavors.

David Heine, Sterling Augustine, Bob Wilson and John Ruttenberg from Tensilica,
Inc.@: added support for Xtensa processors.

Several engineers at Cygnus Support have also provided many small bug fixes and
configuration enhancements.

Jon Beniston added support for the Lattice Mico32 architecture.

Many others have contributed large or small bugfixes and enhancements.  If
you have contributed significant work and are not mentioned on this list, and
want to be, let us know.  Some of the history has been lost; we are not
intentionally leaving anyone out.

@node GNU Free Documentation License
@appendix GNU Free Documentation License
@include fdl.texi

@node AS Index
@unnumbered AS Index

@printindex cp

@bye
@c Local Variables:
@c fill-column: 79
@c End:
