blob: 2b2fde479f1359e8a318fbf917b856f8308dee8c [file] [log] [blame]
This is as.info, produced by makeinfo version 4.3 from as.texinfo.
START-INFO-DIR-ENTRY
* As: (as). The GNU assembler.
* Gas: (as). The GNU assembler.
END-INFO-DIR-ENTRY
This file documents the GNU Assembler "as".
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002
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.1 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".

File: as.info, Node: MIPS ISA, Next: MIPS autoextend, Prev: MIPS Stabs, Up: MIPS-Dependent
Directives to override the ISA level
------------------------------------
GNU `as' supports an additional directive to change the MIPS
Instruction Set Architecture level on the fly: `.set mipsN'. N should
be a number from 0 to 5, or 32, 32r2, or 64. The values other than 0
make the assembler accept instructions for the corresponding ISA level,
from that point on in the assembly. `.set mipsN' affects not only
which instructions are permitted, but also how certain macros are
expanded. `.set mips0' restores the ISA level to its original level:
either the level you selected with command line options, or the default
for your configuration. You can use this feature to permit specific
R4000 instructions while assembling in 32 bit mode. Use this directive
with care!
The directive `.set mips16' puts the assembler into MIPS 16 mode, in
which it will assemble instructions for the MIPS 16 processor. Use
`.set nomips16' to return to normal 32 bit mode.
Traditional MIPS assemblers do not support this directive.

File: as.info, Node: MIPS autoextend, Next: MIPS insn, Prev: MIPS ISA, Up: MIPS-Dependent
Directives for extending MIPS 16 bit instructions
-------------------------------------------------
By default, MIPS 16 instructions are automatically extended to 32
bits when necessary. The directive `.set noautoextend' will turn this
off. When `.set noautoextend' is in effect, any 32 bit instruction
must be explicitly extended with the `.e' modifier (e.g., `li.e
$4,1000'). The directive `.set autoextend' may be used to once again
automatically extend instructions when necessary.
This directive is only meaningful when in MIPS 16 mode. Traditional
MIPS assemblers do not support this directive.

File: as.info, Node: MIPS insn, Next: MIPS option stack, Prev: MIPS autoextend, Up: MIPS-Dependent
Directive to mark data as an instruction
----------------------------------------
The `.insn' directive tells `as' that the following data is actually
instructions. This makes a difference in MIPS 16 mode: when loading
the address of a label which precedes instructions, `as' automatically
adds 1 to the value, so that jumping to the loaded address will do the
right thing.

File: as.info, Node: MIPS option stack, Next: MIPS ASE instruction generation overrides, Prev: MIPS insn, Up: MIPS-Dependent
Directives to save and restore options
--------------------------------------
The directives `.set push' and `.set pop' may be used to save and
restore the current settings for all the options which are controlled
by `.set'. The `.set push' directive saves the current settings on a
stack. The `.set pop' directive pops the stack and restores the
settings.
These directives can be useful inside an macro which must change an
option such as the ISA level or instruction reordering but does not want
to change the state of the code which invoked the macro.
Traditional MIPS assemblers do not support these directives.

File: as.info, Node: MIPS ASE instruction generation overrides, Prev: MIPS option stack, Up: MIPS-Dependent
Directives to control generation of MIPS ASE instructions
---------------------------------------------------------
The directive `.set mips3d' makes the assembler accept instructions
from the MIPS-3D Application Specific Extension from that point on in
the assembly. The `.set nomips3d' directive prevents MIPS-3D
instructions from being accepted.
The directive `.set mdmx' makes the assembler accept instructions
from the MDMX Application Specific Extension from that point on in the
assembly. The `.set nomdmx' directive prevents MDMX instructions from
being accepted.
Traditional MIPS assemblers do not support these directives.

File: as.info, Node: MMIX-Dependent, Next: MSP430-Dependent, Prev: MIPS-Dependent, Up: Machine Dependencies
MMIX Dependent Features
=======================
* Menu:
* MMIX-Opts:: Command-line Options
* MMIX-Expand:: Instruction expansion
* MMIX-Syntax:: Syntax
* MMIX-mmixal:: Differences to `mmixal' syntax and semantics

File: as.info, Node: MMIX-Opts, Next: MMIX-Expand, Up: MMIX-Dependent
Command-line Options
--------------------
The MMIX version of `as' has some machine-dependent options.
When `--fixed-special-register-names' is specified, only the register
names specified in *Note MMIX-Regs:: are recognized in the instructions
`PUT' and `GET'.
You can use the `--globalize-symbols' to make all symbols global.
This option is useful when splitting up a `mmixal' program into several
files.
The `--gnu-syntax' turns off most syntax compatibility with
`mmixal'. Its usability is currently doubtful.
The `--relax' option is not fully supported, but will eventually make
the object file prepared for linker relaxation.
If you want to avoid inadvertently calling a predefined symbol and
would rather get an error, for example when using `as' with a compiler
or other machine-generated code, specify `--no-predefined-syms'. This
turns off built-in predefined definitions of all such symbols,
including rounding-mode symbols, segment symbols, `BIT' symbols, and
`TRAP' symbols used in `mmix' "system calls". It also turns off
predefined special-register names, except when used in `PUT' and `GET'
instructions.
By default, some instructions are expanded to fit the size of the
operand or an external symbol (*note MMIX-Expand::). By passing
`--no-expand', no such expansion will be done, instead causing errors
at link time if the operand does not fit.
The `mmixal' documentation (*note mmixsite::) specifies that global
registers allocated with the `GREG' directive (*note MMIX-greg::) and
initialized to the same non-zero value, will refer to the same global
register. This isn't strictly enforceable in `as' since the final
addresses aren't known until link-time, but it will do an effort unless
the `--no-merge-gregs' option is specified. (Register merging isn't
yet implemented in `ld'.)
`as' will warn every time it expands an instruction to fit an
operand unless the option `-x' is specified. It is believed that this
behaviour is more useful than just mimicking `mmixal''s behaviour, in
which instructions are only expanded if the `-x' option is specified,
and assembly fails otherwise, when an instruction needs to be expanded.
It needs to be kept in mind that `mmixal' is both an assembler and
linker, while `as' will expand instructions that at link stage can be
contracted. (Though linker relaxation isn't yet implemented in `ld'.)
The option `-x' also imples `--linker-allocated-gregs'.
Usually a two-operand-expression (*note GREG-base::) without a
matching `GREG' directive is treated as an error by `as'. When the
option `--linker-allocated-gregs' is in effect, they are instead passed
through to the linker, which will allocate as many global registers as
is needed.

File: as.info, Node: MMIX-Expand, Next: MMIX-Syntax, Prev: MMIX-Opts, Up: MMIX-Dependent
Instruction expansion
---------------------
When `as' encounters an instruction with an operand that is either
not known or does not fit the operand size of the instruction, `as'
(and `ld') will expand the instruction into a sequence of instructions
semantically equivalent to the operand fitting the instruction.
Expansion will take place for the following instructions:
`GETA'
Expands to a sequence of four instructions: `SETL', `INCML',
`INCMH' and `INCH'. The operand must be a multiple of four.
Conditional branches
A branch instruction is turned into a branch with the complemented
condition and prediction bit over five instructions; four
instructions setting `$255' to the operand value, which like with
`GETA' must be a multiple of four, and a final `GO $255,$255,0'.
`PUSHJ'
Similar to expansion for conditional branches; four instructions
set `$255' to the operand value, followed by a `PUSHGO
$255,$255,0'.
`JMP'
Similar to conditional branches and `PUSHJ'. The final instruction
is `GO $255,$255,0'.
The linker `ld' is expected to shrink these expansions for code
assembled with `--relax' (though not currently implemented).

File: as.info, Node: MMIX-Syntax, Next: MMIX-mmixal, Prev: MMIX-Expand, Up: MMIX-Dependent
Syntax
------
The assembly syntax is supposed to be upward compatible with that
described in Sections 1.3 and 1.4 of `The Art of Computer Programming,
Volume 1'. Draft versions of those chapters as well as other MMIX
information is located at
<http://www-cs-faculty.stanford.edu/~knuth/mmix-news.html>. Most code
examples from the mmixal package located there should work unmodified
when assembled and linked as single files, with a few noteworthy
exceptions (*note MMIX-mmixal::).
Before an instruction is emitted, the current location is aligned to
the next four-byte boundary. If a label is defined at the beginning of
the line, its value will be the aligned value.
In addition to the traditional hex-prefix `0x', a hexadecimal number
can also be specified by the prefix character `#'.
After all operands to an MMIX instruction or directive have been
specified, the rest of the line is ignored, treated as a comment.
* Menu:
* MMIX-Chars:: Special Characters
* MMIX-Symbols:: Symbols
* MMIX-Regs:: Register Names
* MMIX-Pseudos:: Assembler Directives

File: as.info, Node: MMIX-Chars, Next: MMIX-Symbols, Up: MMIX-Syntax
Special Characters
..................
The characters `*' and `#' are line comment characters; each start a
comment at the beginning of a line, but only at the beginning of a
line. A `#' prefixes a hexadecimal number if found elsewhere on a line.
Two other characters, `%' and `!', each start a comment anywhere on
the line. Thus you can't use the `modulus' and `not' operators in
expressions normally associated with these two characters.
A `;' is a line separator, treated as a new-line, so separate
instructions can be specified on a single line.

File: as.info, Node: MMIX-Symbols, Next: MMIX-Regs, Prev: MMIX-Chars, Up: MMIX-Syntax
Symbols
.......
The character `:' is permitted in identifiers. There are two
exceptions to it being treated as any other symbol character: if a
symbol begins with `:', it means that the symbol is in the global
namespace and that the current prefix should not be prepended to that
symbol (*note MMIX-prefix::). The `:' is then not considered part of
the symbol. For a symbol in the label position (first on a line), a `:'
at the end of a symbol is silently stripped off. A label is permitted,
but not required, to be followed by a `:', as with many other assembly
formats.
The character `@' in an expression, is a synonym for `.', the
current location.
In addition to the common forward and backward local symbol formats
(*note Symbol Names::), they can be specified with upper-case `B' and
`F', as in `8B' and `9F'. A local label defined for the current
position is written with a `H' appended to the number:
3H LDB $0,$1,2
This and traditional local-label formats cannot be mixed: a label
must be defined and referred to using the same format.
There's a minor caveat: just as for the ordinary local symbols, the
local symbols are translated into ordinary symbols using control
characters are to hide the ordinal number of the symbol.
Unfortunately, these symbols are not translated back in error messages.
Thus you may see confusing error messages when local symbols are used.
Control characters `\003' (control-C) and `\004' (control-D) are used
for the MMIX-specific local-symbol syntax.
The symbol `Main' is handled specially; it is always global.
By defining the symbols `__.MMIX.start..text' and
`__.MMIX.start..data', the address of respectively the `.text' and
`.data' segments of the final program can be defined, though when
linking more than one object file, the code or data in the object file
containing the symbol is not guaranteed to be start at that position;
just the final executable. *Note MMIX-loc::.

File: as.info, Node: MMIX-Regs, Next: MMIX-Pseudos, Prev: MMIX-Symbols, Up: MMIX-Syntax
Register names
..............
Local and global registers are specified as `$0' to `$255'. The
recognized special register names are `rJ', `rA', `rB', `rC', `rD',
`rE', `rF', `rG', `rH', `rI', `rK', `rL', `rM', `rN', `rO', `rP', `rQ',
`rR', `rS', `rT', `rU', `rV', `rW', `rX', `rY', `rZ', `rBB', `rTT',
`rWW', `rXX', `rYY' and `rZZ'. A leading `:' is optional for special
register names.
Local and global symbols can be equated to register names and used in
place of ordinary registers.
Similarly for special registers, local and global symbols can be
used. Also, symbols equated from numbers and constant expressions are
allowed in place of a special register, except when either of the
options `--no-predefined-syms' and `--fixed-special-register-names' are
specified. Then only the special register names above are allowed for
the instructions having a special register operand; `GET' and `PUT'.

File: as.info, Node: MMIX-Pseudos, Prev: MMIX-Regs, Up: MMIX-Syntax
Assembler Directives
....................
`LOC'
The `LOC' directive sets the current location to the value of the
operand field, which may include changing sections. If the
operand is a constant, the section is set to either `.data' if the
value is `0x2000000000000000' or larger, else it is set to `.text'.
Within a section, the current location may only be changed to
monotonically higher addresses. A LOC expression must be a
previously defined symbol or a "pure" constant.
An example, which sets the label PREV to the current location, and
updates the current location to eight bytes forward:
prev LOC @+8
When a LOC has a constant as its operand, a symbol
`__.MMIX.start..text' or `__.MMIX.start..data' is defined
depending on the address as mentioned above. Each such symbol is
interpreted as special by the linker, locating the section at that
address. Note that if multiple files are linked, the first object
file with that section will be mapped to that address (not
necessarily the file with the LOC definition).
`LOCAL'
Example:
LOCAL external_symbol
LOCAL 42
.local asymbol
This directive-operation generates a link-time assertion that the
operand does not correspond to a global register. The operand is
an expression that at link-time resolves to a register symbol or a
number. A number is treated as the register having that number.
There is one restriction on the use of this directive: the
pseudo-directive must be placed in a section with contents, code
or data.
`IS'
The `IS' directive:
asymbol IS an_expression
sets the symbol `asymbol' to `an_expression'. A symbol may not be
set more than once using this directive. Local labels may be set
using this directive, for example:
5H IS @+4
`GREG'
This directive reserves a global register, gives it an initial
value and optionally gives it a symbolic name. Some examples:
areg GREG
breg GREG data_value
GREG data_buffer
.greg creg, another_data_value
The symbolic register name can be used in place of a (non-special)
register. If a value isn't provided, it defaults to zero. Unless
the option `--no-merge-gregs' is specified, non-zero registers
allocated with this directive may be eliminated by `as'; another
register with the same value used in its place. Any of the
instructions `CSWAP', `GO', `LDA', `LDBU', `LDB', `LDHT', `LDOU',
`LDO', `LDSF', `LDTU', `LDT', `LDUNC', `LDVTS', `LDWU', `LDW',
`PREGO', `PRELD', `PREST', `PUSHGO', `STBU', `STB', `STCO', `STHT',
`STOU', `STSF', `STTU', `STT', `STUNC', `SYNCD', `SYNCID', can
have a value nearby an initial value in place of its second and
third operands. Here, "nearby" is defined as within the range
0...255 from the initial value of such an allocated register.
buffer1 BYTE 0,0,0,0,0
buffer2 BYTE 0,0,0,0,0
...
GREG buffer1
LDOU $42,buffer2
In the example above, the `Y' field of the `LDOUI' instruction
(LDOU with a constant Z) will be replaced with the global register
allocated for `buffer1', and the `Z' field will have the value 5,
the offset from `buffer1' to `buffer2'. The result is equivalent
to this code:
buffer1 BYTE 0,0,0,0,0
buffer2 BYTE 0,0,0,0,0
...
tmpreg GREG buffer1
LDOU $42,tmpreg,(buffer2-buffer1)
Global registers allocated with this directive are allocated in
order higher-to-lower within a file. Other than that, the exact
order of register allocation and elimination is undefined. For
example, the order is undefined when more than one file with such
directives are linked together. With the options `-x' and
`--linker-allocated-gregs', `GREG' directives for two-operand
cases like the one mentioned above can be omitted. Sufficient
global registers will then be allocated by the linker.
`BYTE'
The `BYTE' directive takes a series of operands separated by a
comma. If an operand is a string (*note Strings::), each
character of that string is emitted as a byte. Other operands
must be constant expressions without forward references, in the
range 0...255. If you need operands having expressions with
forward references, use `.byte' (*note Byte::). An operand can be
omitted, defaulting to a zero value.
`WYDE'
`TETRA'
`OCTA'
The directives `WYDE', `TETRA' and `OCTA' emit constants of two,
four and eight bytes size respectively. Before anything else
happens for the directive, the current location is aligned to the
respective constant-size bondary. If a label is defined at the
beginning of the line, its value will be that after the alignment.
A single operand can be omitted, defaulting to a zero value
emitted for the directive. Operands can be expressed as strings
(*note Strings::), in which case each character in the string is
emitted as a separate constant of the size indicated by the
directive.
`PREFIX'
The `PREFIX' directive sets a symbol name prefix to be prepended to
all symbols (except local symbols, *note MMIX-Symbols::), that are
not prefixed with `:', until the next `PREFIX' directive. Such
prefixes accumulate. For example,
PREFIX a
PREFIX b
c IS 0
defines a symbol `abc' with the value 0.
`BSPEC'
`ESPEC'
A pair of `BSPEC' and `ESPEC' directives delimit a section of
special contents (without specified semantics). Example:
BSPEC 42
TETRA 1,2,3
ESPEC
The single operand to `BSPEC' must be number in the range 0...255.
The `BSPEC' number 80 is used by the GNU binutils implementation.

File: as.info, Node: MMIX-mmixal, Prev: MMIX-Syntax, Up: MMIX-Dependent
Differences to `mmixal'
-----------------------
The binutils `as' and `ld' combination has a few differences in
function compared to `mmixal' (*note mmixsite::).
The replacement of a symbol with a GREG-allocated register (*note
GREG-base::) is not handled the exactly same way in `as' as in
`mmixal'. This is apparent in the `mmixal' example file `inout.mms',
where different registers with different offsets, eventually yielding
the same address, are used in the first instruction. This type of
difference should however not affect the function of any program unless
it has specific assumptions about the allocated register number.
Line numbers (in the `mmo' object format) are currently not
supported.
Expression operator precedence is not that of mmixal: operator
precedence is that of the C programming language. It's recommended to
use parentheses to explicitly specify wanted operator precedence
whenever more than one type of operators are used.
The serialize unary operator `&', the fractional division operator
`//', the logical not operator `!' and the modulus operator `%' are not
available.
Symbols are not global by default, unless the option
`--globalize-symbols' is passed. Use the `.global' directive to
globalize symbols (*note Global::).
Operand syntax is a bit stricter with `as' than `mmixal'. For
example, you can't say `addu 1,2,3', instead you must write `addu
$1,$2,3'.
You can't LOC to a lower address than those already visited (i.e.
"backwards").
A LOC directive must come before any emitted code.
Predefined symbols are visible as file-local symbols after use. (In
the ELF file, that is--the linked mmo file has no notion of a file-local
symbol.)
Some mapping of constant expressions to sections in LOC expressions
is attempted, but that functionality is easily confused and should be
avoided unless compatibility with `mmixal' is required. A LOC
expression to `0x2000000000000000' or higher, maps to the `.data'
section and lower addresses map to the `.text' section (*note
MMIX-loc::).
The code and data areas are each contiguous. Sparse programs with
far-away LOC directives will take up the same amount of space as a
contiguous program with zeros filled in the gaps between the LOC
directives. If you need sparse programs, you might try and get the
wanted effect with a linker script and splitting up the code parts into
sections (*note Section::). Assembly code for this, to be compatible
with `mmixal', would look something like:
.if 0
LOC away_expression
.else
.section away,"ax"
.fi
`as' will not execute the LOC directive and `mmixal' ignores the
lines with `.'. This construct can be used generally to help
compatibility.
Symbols can't be defined twice-not even to the same value.
Instruction mnemonics are recognized case-insensitive, though the
`IS' and `GREG' pseudo-operations must be specified in upper-case
characters.
There's no unicode support.
The following is a list of programs in `mmix.tar.gz', available at
<http://www-cs-faculty.stanford.edu/~knuth/mmix-news.html>, last
checked with the version dated 2001-08-25 (md5sum
c393470cfc86fac040487d22d2bf0172) that assemble with `mmixal' but do
not assemble with `as':
`silly.mms'
LOC to a previous address.
`sim.mms'
Redefines symbol `Done'.
`test.mms'
Uses the serial operator `&'.

File: as.info, Node: MSP430-Dependent, Next: SH-Dependent, Prev: MMIX-Dependent, Up: Machine Dependencies
MSP 430 Dependent Features
==========================
* Menu:
* MSP430 Options:: Options
* MSP430 Syntax:: Syntax
* MSP430 Floating Point:: Floating Point
* MSP430 Directives:: MSP 430 Machine Directives
* MSP430 Opcodes:: Opcodes

File: as.info, Node: MSP430 Options, Next: MSP430 Syntax, Up: MSP430-Dependent
Options
-------
`as' has only -m flag which selects the mpu arch. Currently has no
effect.

File: as.info, Node: MSP430 Syntax, Next: MSP430 Floating Point, Prev: MSP430 Options, Up: MSP430-Dependent
Syntax
------
* Menu:
* MSP430-Macros:: Macros
* MSP430-Chars:: Special Characters
* MSP430-Regs:: Register Names
* MSP430-Ext:: Assembler Extensions

File: as.info, Node: MSP430-Macros, Next: MSP430-Chars, Up: MSP430 Syntax
Macros
......
The macro syntax used on the MSP 430 is like that described in the
MSP 430 Family Assembler Specification. Normal `as' macros should
still work.
Additional built-in macros are:
`llo(exp)'
Extracts least significant word from 32-bit expression 'exp'.
`lhi(exp)'
Extracts most significant word from 32-bit expression 'exp'.
`hlo(exp)'
Extracts 3rd word from 64-bit expression 'exp'.
`hhi(exp)'
Extracts 4rd word from 64-bit expression 'exp'.
They normally being used as an immediate source operand.
mov #llo(1), r10 ; == mov #1, r10
mov #lhi(1), r10 ; == mov #0, r10

File: as.info, Node: MSP430-Chars, Next: MSP430-Regs, Prev: MSP430-Macros, Up: MSP430 Syntax
Special Characters
..................
`;' is the line comment character.
The character `$' in jump instructions indicates current location and
implemented only for TI syntax compatibility.

File: as.info, Node: MSP430-Regs, Next: MSP430-Ext, Prev: MSP430-Chars, Up: MSP430 Syntax
Register Names
..............
General-purpose registers are represented by predefined symbols of
the form `rN' (for global registers), where N represents a number
between `0' and `15'. The leading letters may be in either upper or
lower case; for example, `r13' and `R7' are both valid register names.
Register names `PC', `SP' and `SR' cannot be used as register names
and will be treated as variables. Use `r0', `r1', and `r2' instead.

File: as.info, Node: MSP430-Ext, Prev: MSP430-Regs, Up: MSP430 Syntax
Assembler Extensions
....................
`@rN'
As destination operand being treated as `0(rn)'
`0(rN)'
As source operand being treated as `@rn'
`jCOND +N'
Skips next N bytes followed by jump instruction and equivalent to
`jCOND $+N+2'

File: as.info, Node: MSP430 Floating Point, Next: MSP430 Directives, Prev: MSP430 Syntax, Up: MSP430-Dependent
Floating Point
--------------
The MSP 430 family uses IEEE 32-bit floating-point numbers.

File: as.info, Node: MSP430 Directives, Next: MSP430 Opcodes, Prev: MSP430 Floating Point, Up: MSP430-Dependent
MSP 430 Machine Directives
--------------------------
`.file'
This directive is ignored; it is accepted for compatibility with
other MSP 430 assemblers.
_Warning:_ in other versions of the GNU assembler, `.file' is
used for the directive called `.app-file' in the MSP 430
support.
`.line'
This directive is ignored; it is accepted for compatibility with
other MSP 430 assemblers.
`.arch'
Currently this directive is ignored; it is accepted for
compatibility with other MSP 430 assemblers.

File: as.info, Node: MSP430 Opcodes, Prev: MSP430 Directives, Up: MSP430-Dependent
Opcodes
-------
`as' implements all the standard MSP 430 opcodes. No additional
pseudo-instructions are needed on this family.
For information on the 430 machine instruction set, see `MSP430
User's Manual, document slau049b', Texas Instrument, Inc.

File: as.info, Node: PDP-11-Dependent, Next: PJ-Dependent, Prev: SH64-Dependent, Up: Machine Dependencies
PDP-11 Dependent Features
=========================
* Menu:
* PDP-11-Options:: Options
* PDP-11-Pseudos:: Assembler Directives
* PDP-11-Syntax:: DEC Syntax versus BSD Syntax
* PDP-11-Mnemonics:: Instruction Naming
* PDP-11-Synthetic:: Synthetic Instructions

File: as.info, Node: PDP-11-Options, Next: PDP-11-Pseudos, Up: PDP-11-Dependent
Options
-------
The PDP-11 version of `as' has a rich set of machine dependent
options.
Code Generation Options
.......................
`-mpic | -mno-pic'
Generate position-independent (or position-dependent) code.
The default is to generate position-independent code.
Instruction Set Extension Options
.................................
These options enables or disables the use of extensions over the base
line instruction set as introduced by the first PDP-11 CPU: the KA11.
Most options come in two variants: a `-m'EXTENSION that enables
EXTENSION, and a `-mno-'EXTENSION that disables EXTENSION.
The default is to enable all extensions.
`-mall | -mall-extensions'
Enable all instruction set extensions.
`-mno-extensions'
Disable all instruction set extensions.
`-mcis | -mno-cis'
Enable (or disable) the use of the commercial instruction set,
which consists of these instructions: `ADDNI', `ADDN', `ADDPI',
`ADDP', `ASHNI', `ASHN', `ASHPI', `ASHP', `CMPCI', `CMPC',
`CMPNI', `CMPN', `CMPPI', `CMPP', `CVTLNI', `CVTLN', `CVTLPI',
`CVTLP', `CVTNLI', `CVTNL', `CVTNPI', `CVTNP', `CVTPLI', `CVTPL',
`CVTPNI', `CVTPN', `DIVPI', `DIVP', `L2DR', `L3DR', `LOCCI',
`LOCC', `MATCI', `MATC', `MOVCI', `MOVC', `MOVRCI', `MOVRC',
`MOVTCI', `MOVTC', `MULPI', `MULP', `SCANCI', `SCANC', `SKPCI',
`SKPC', `SPANCI', `SPANC', `SUBNI', `SUBN', `SUBPI', and `SUBP'.
`-mcsm | -mno-csm'
Enable (or disable) the use of the `CSM' instruction.
`-meis | -mno-eis'
Enable (or disable) the use of the extended instruction set, which
consists of these instructions: `ASHC', `ASH', `DIV', `MARK',
`MUL', `RTT', `SOB' `SXT', and `XOR'.
`-mfis | -mkev11'
`-mno-fis | -mno-kev11'
Enable (or disable) the use of the KEV11 floating-point
instructions: `FADD', `FDIV', `FMUL', and `FSUB'.
`-mfpp | -mfpu | -mfp-11'
`-mno-fpp | -mno-fpu | -mno-fp-11'
Enable (or disable) the use of FP-11 floating-point instructions:
`ABSF', `ADDF', `CFCC', `CLRF', `CMPF', `DIVF', `LDCFF', `LDCIF',
`LDEXP', `LDF', `LDFPS', `MODF', `MULF', `NEGF', `SETD', `SETF',
`SETI', `SETL', `STCFF', `STCFI', `STEXP', `STF', `STFPS', `STST',
`SUBF', and `TSTF'.
`-mlimited-eis | -mno-limited-eis'
Enable (or disable) the use of the limited extended instruction
set: `MARK', `RTT', `SOB', `SXT', and `XOR'.
The -mno-limited-eis options also implies -mno-eis.
`-mmfpt | -mno-mfpt'
Enable (or disable) the use of the `MFPT' instruction.
`-mmultiproc | -mno-multiproc'
Enable (or disable) the use of multiprocessor instructions:
`TSTSET' and `WRTLCK'.
`-mmxps | -mno-mxps'
Enable (or disable) the use of the `MFPS' and `MTPS' instructions.
`-mspl | -mno-spl'
Enable (or disable) the use of the `SPL' instruction.
Enable (or disable) the use of the microcode instructions: `LDUB',
`MED', and `XFC'.
CPU Model Options
.................
These options enable the instruction set extensions supported by a
particular CPU, and disables all other extensions.
`-mka11'
KA11 CPU. Base line instruction set only.
`-mkb11'
KB11 CPU. Enable extended instruction set and `SPL'.
`-mkd11a'
KD11-A CPU. Enable limited extended instruction set.
`-mkd11b'
KD11-B CPU. Base line instruction set only.
`-mkd11d'
KD11-D CPU. Base line instruction set only.
`-mkd11e'
KD11-E CPU. Enable extended instruction set, `MFPS', and `MTPS'.
`-mkd11f | -mkd11h | -mkd11q'
KD11-F, KD11-H, or KD11-Q CPU. Enable limited extended
instruction set, `MFPS', and `MTPS'.
`-mkd11k'
KD11-K CPU. Enable extended instruction set, `LDUB', `MED',
`MFPS', `MFPT', `MTPS', and `XFC'.
`-mkd11z'
KD11-Z CPU. Enable extended instruction set, `CSM', `MFPS',
`MFPT', `MTPS', and `SPL'.
`-mf11'
F11 CPU. Enable extended instruction set, `MFPS', `MFPT', and
`MTPS'.
`-mj11'
J11 CPU. Enable extended instruction set, `CSM', `MFPS', `MFPT',
`MTPS', `SPL', `TSTSET', and `WRTLCK'.
`-mt11'
T11 CPU. Enable limited extended instruction set, `MFPS', and
`MTPS'.
Machine Model Options
.....................
These options enable the instruction set extensions supported by a
particular machine model, and disables all other extensions.
`-m11/03'
Same as `-mkd11f'.
`-m11/04'
Same as `-mkd11d'.
`-m11/05 | -m11/10'
Same as `-mkd11b'.
`-m11/15 | -m11/20'
Same as `-mka11'.
`-m11/21'
Same as `-mt11'.
`-m11/23 | -m11/24'
Same as `-mf11'.
`-m11/34'
Same as `-mkd11e'.
`-m11/34a'
Ame as `-mkd11e' `-mfpp'.
`-m11/35 | -m11/40'
Same as `-mkd11a'.
`-m11/44'
Same as `-mkd11z'.
`-m11/45 | -m11/50 | -m11/55 | -m11/70'
Same as `-mkb11'.
`-m11/53 | -m11/73 | -m11/83 | -m11/84 | -m11/93 | -m11/94'
Same as `-mj11'.
`-m11/60'
Same as `-mkd11k'.

File: as.info, Node: PDP-11-Pseudos, Next: PDP-11-Syntax, Prev: PDP-11-Options, Up: PDP-11-Dependent
Assembler Directives
--------------------
The PDP-11 version of `as' has a few machine dependent assembler
directives.
`.bss'
Switch to the `bss' section.
`.even'
Align the location counter to an even number.

File: as.info, Node: PDP-11-Syntax, Next: PDP-11-Mnemonics, Prev: PDP-11-Pseudos, Up: PDP-11-Dependent
PDP-11 Assembly Language Syntax
-------------------------------
`as' supports both DEC syntax and BSD syntax. The only difference
is that in DEC syntax, a `#' character is used to denote an immediate
constants, while in BSD syntax the character for this purpose is `$'.
eneral-purpose registers are named `r0' through `r7'. Mnemonic
alternatives for `r6' and `r7' are `sp' and `pc', respectively.
Floating-point registers are named `ac0' through `ac3', or
alternatively `fr0' through `fr3'.
Comments are started with a `#' or a `/' character, and extend to
the end of the line. (FIXME: clash with immediates?)

File: as.info, Node: PDP-11-Mnemonics, Next: PDP-11-Synthetic, Prev: PDP-11-Syntax, Up: PDP-11-Dependent
Instruction Naming
------------------
Some instructions have alternative names.
`BCC'
`BHIS'
`BCS'
`BLO'
`L2DR'
`L2D'
`L3DR'
`L3D'
`SYS'
`TRAP'

File: as.info, Node: PDP-11-Synthetic, Prev: PDP-11-Mnemonics, Up: PDP-11-Dependent
Synthetic Instructions
----------------------
The `JBR' and `J'CC synthetic instructions are not supported yet.

File: as.info, Node: PJ-Dependent, Next: PPC-Dependent, Prev: PDP-11-Dependent, Up: Machine Dependencies
picoJava Dependent Features
===========================
* Menu:
* PJ Options:: Options

File: as.info, Node: PJ Options, Up: PJ-Dependent
Options
-------
`as' has two additional command-line options for the picoJava
architecture.
`-ml'
This option selects little endian data output.
`-mb'
This option selects big endian data output.

File: as.info, Node: PPC-Dependent, Next: Sparc-Dependent, Prev: PJ-Dependent, Up: Machine Dependencies
PowerPC Dependent Features
==========================
* Menu:
* PowerPC-Opts:: Options

File: as.info, Node: PowerPC-Opts, Up: PPC-Dependent
Options
-------
The PowerPC chip family includes several successive levels, using
the same core instruction set, but including a few additional
instructions at each level. There are exceptions to this however. For
details on what instructions each variant supports, please see the
chip's architecture reference manual.
The following table lists all available PowerPC options.
`-mpwrx | -mpwr2'
Generate code for POWER/2 (RIOS2).
`-mpwr'
Generate code for POWER (RIOS1)
`-m601'
Generate code for PowerPC 601.
`-mppc, -mppc32, -m603, -m604'
Generate code for PowerPC 603/604.
`-m403, -m405'
Generate code for PowerPC 403/405.
`-m7400, -m7410, -m7450, -m7455'
Generate code for PowerPC 7400/7410/7450/7455.
`-mppc64, -m620'
Generate code for PowerPC 620/625/630.
`-mppc64bridge'
Generate code for PowerPC 64, including bridge insns.
`-mbooke64'
Generate code for 64-bit BookE.
`-mbooke, mbooke32'
Generate code for 32-bit BookE.
`-maltivec'
Generate code for processors with AltiVec instructions.
`-mpower4'
Generate code for Power4 architecture.
`-mcom'
Generate code Power/PowerPC common instructions.
`-many'
Generate code for any architecture (PWR/PWRX/PPC).
`-mregnames'
Allow symbolic names for registers.
`-mno-regnames'
Do not allow symbolic names for registers.
`-mrelocatable'
Support for GCC's -mrelocatble option.
`-mrelocatable-lib'
Support for GCC's -mrelocatble-lib option.
`-memb'
Set PPC_EMB bit in ELF flags.
`-mlittle, -mlittle-endian'
Generate code for a little endian machine.
`-mbig, -mbig-endian'
Generate code for a big endian machine.
`-msolaris'
Generate code for Solaris.
`-mno-solaris'
Do not generate code for Solaris.

File: as.info, Node: SH-Dependent, Next: SH64-Dependent, Prev: MSP430-Dependent, Up: Machine Dependencies
Renesas / SuperH SH Dependent Features
======================================
* Menu:
* SH Options:: Options
* SH Syntax:: Syntax
* SH Floating Point:: Floating Point
* SH Directives:: SH Machine Directives
* SH Opcodes:: Opcodes

File: as.info, Node: SH Options, Next: SH Syntax, Up: SH-Dependent
Options
-------
`as' has following command-line options for the Renesas (formerly
Hitachi) / SuperH SH family.
`-little'
Generate little endian code.
`-big'
Generate big endian code.
`-relax'
Alter jump instructions for long displacements.
`-small'
Align sections to 4 byte boundaries, not 16.
`-dsp'
Enable sh-dsp insns, and disable sh3e / sh4 insns.

File: as.info, Node: SH Syntax, Next: SH Floating Point, Prev: SH Options, Up: SH-Dependent
Syntax
------
* Menu:
* SH-Chars:: Special Characters
* SH-Regs:: Register Names
* SH-Addressing:: Addressing Modes

File: as.info, Node: SH-Chars, Next: SH-Regs, Up: SH Syntax
Special Characters
..................
`!' is the line comment character.
You can use `;' instead of a newline to separate statements.
Since `$' has no special meaning, you may use it in symbol names.

File: as.info, Node: SH-Regs, Next: SH-Addressing, Prev: SH-Chars, Up: SH Syntax
Register Names
..............
You can use the predefined symbols `r0', `r1', `r2', `r3', `r4',
`r5', `r6', `r7', `r8', `r9', `r10', `r11', `r12', `r13', `r14', and
`r15' to refer to the SH registers.
The SH also has these control registers:
`pr'
procedure register (holds return address)
`pc'
program counter
`mach'
`macl'
high and low multiply accumulator registers
`sr'
status register
`gbr'
global base register
`vbr'
vector base register (for interrupt vectors)

File: as.info, Node: SH-Addressing, Prev: SH-Regs, Up: SH Syntax
Addressing Modes
................
`as' understands the following addressing modes for the SH. `RN' in
the following refers to any of the numbered registers, but _not_ the
control registers.
`RN'
Register direct
`@RN'
Register indirect
`@-RN'
Register indirect with pre-decrement
`@RN+'
Register indirect with post-increment
`@(DISP, RN)'
Register indirect with displacement
`@(R0, RN)'
Register indexed
`@(DISP, GBR)'
`GBR' offset
`@(R0, GBR)'
GBR indexed
`ADDR'
`@(DISP, PC)'
PC relative address (for branch or for addressing memory). The
`as' implementation allows you to use the simpler form ADDR
anywhere a PC relative address is called for; the alternate form
is supported for compatibility with other assemblers.
`#IMM'
Immediate data

File: as.info, Node: SH Floating Point, Next: SH Directives, Prev: SH Syntax, Up: SH-Dependent
Floating Point
--------------
The SH family has no hardware floating point, but the `.float'
directive generates IEEE floating-point numbers for compatibility with
other development tools.

File: as.info, Node: SH Directives, Next: SH Opcodes, Prev: SH Floating Point, Up: SH-Dependent
SH Machine Directives
---------------------
`uaword'
`ualong'
`as' will issue a warning when a misaligned `.word' or `.long'
directive is used. You may use `.uaword' or `.ualong' to indicate
that the value is intentionally misaligned.

File: as.info, Node: SH Opcodes, Prev: SH Directives, Up: SH-Dependent
Opcodes
-------
For detailed information on the SH machine instruction set, see
`SH-Microcomputer User's Manual' (Renesas) or `SH-4 32-bit CPU Core
Architecture' (SuperH) and `SuperH (SH) 64-Bit RISC Series' (SuperH).
`as' implements all the standard SH opcodes. No additional
pseudo-instructions are needed on this family. Note, however, that
because `as' supports a simpler form of PC-relative addressing, you may
simply write (for example)
mov.l bar,r0
where other assemblers might require an explicit displacement to `bar'
from the program counter:
mov.l @(DISP, PC)
Here is a summary of SH opcodes:
Legend:
Rn a numbered register
Rm another numbered register
#imm immediate data
disp displacement
disp8 8-bit displacement
disp12 12-bit displacement
add #imm,Rn lds.l @Rn+,PR
add Rm,Rn mac.w @Rm+,@Rn+
addc Rm,Rn mov #imm,Rn
addv Rm,Rn mov Rm,Rn
and #imm,R0 mov.b Rm,@(R0,Rn)
and Rm,Rn mov.b Rm,@-Rn
and.b #imm,@(R0,GBR) mov.b Rm,@Rn
bf disp8 mov.b @(disp,Rm),R0
bra disp12 mov.b @(disp,GBR),R0
bsr disp12 mov.b @(R0,Rm),Rn
bt disp8 mov.b @Rm+,Rn
clrmac mov.b @Rm,Rn
clrt mov.b R0,@(disp,Rm)
cmp/eq #imm,R0 mov.b R0,@(disp,GBR)
cmp/eq Rm,Rn mov.l Rm,@(disp,Rn)
cmp/ge Rm,Rn mov.l Rm,@(R0,Rn)
cmp/gt Rm,Rn mov.l Rm,@-Rn
cmp/hi Rm,Rn mov.l Rm,@Rn
cmp/hs Rm,Rn mov.l @(disp,Rn),Rm
cmp/pl Rn mov.l @(disp,GBR),R0
cmp/pz Rn mov.l @(disp,PC),Rn
cmp/str Rm,Rn mov.l @(R0,Rm),Rn
div0s Rm,Rn mov.l @Rm+,Rn
div0u mov.l @Rm,Rn
div1 Rm,Rn mov.l R0,@(disp,GBR)
exts.b Rm,Rn mov.w Rm,@(R0,Rn)
exts.w Rm,Rn mov.w Rm,@-Rn
extu.b Rm,Rn mov.w Rm,@Rn
extu.w Rm,Rn mov.w @(disp,Rm),R0
jmp @Rn mov.w @(disp,GBR),R0
jsr @Rn mov.w @(disp,PC),Rn
ldc Rn,GBR mov.w @(R0,Rm),Rn
ldc Rn,SR mov.w @Rm+,Rn
ldc Rn,VBR mov.w @Rm,Rn
ldc.l @Rn+,GBR mov.w R0,@(disp,Rm)
ldc.l @Rn+,SR mov.w R0,@(disp,GBR)
ldc.l @Rn+,VBR mova @(disp,PC),R0
lds Rn,MACH movt Rn
lds Rn,MACL muls Rm,Rn
lds Rn,PR mulu Rm,Rn
lds.l @Rn+,MACH neg Rm,Rn
lds.l @Rn+,MACL negc Rm,Rn
nop stc VBR,Rn
not Rm,Rn stc.l GBR,@-Rn
or #imm,R0 stc.l SR,@-Rn
or Rm,Rn stc.l VBR,@-Rn
or.b #imm,@(R0,GBR) sts MACH,Rn
rotcl Rn sts MACL,Rn
rotcr Rn sts PR,Rn
rotl Rn sts.l MACH,@-Rn
rotr Rn sts.l MACL,@-Rn
rte sts.l PR,@-Rn
rts sub Rm,Rn
sett subc Rm,Rn
shal Rn subv Rm,Rn
shar Rn swap.b Rm,Rn
shll Rn swap.w Rm,Rn
shll16 Rn tas.b @Rn
shll2 Rn trapa #imm
shll8 Rn tst #imm,R0
shlr Rn tst Rm,Rn
shlr16 Rn tst.b #imm,@(R0,GBR)
shlr2 Rn xor #imm,R0
shlr8 Rn xor Rm,Rn
sleep xor.b #imm,@(R0,GBR)
stc GBR,Rn xtrct Rm,Rn
stc SR,Rn

File: as.info, Node: SH64-Dependent, Next: PDP-11-Dependent, Prev: SH-Dependent, Up: Machine Dependencies
SuperH SH64 Dependent Features
==============================
* Menu:
* SH64 Options:: Options
* SH64 Syntax:: Syntax
* SH64 Directives:: SH64 Machine Directives
* SH64 Opcodes:: Opcodes

File: as.info, Node: SH64 Options, Next: SH64 Syntax, Up: SH64-Dependent
Options
-------
`-isa=shmedia | -isa=shcompact'
Specify the default instruction set. `SHmedia' specifies the
32-bit opcodes, and `SHcompact' specifies the 16-bit opcodes
compatible with previous SH families. The default depends on the
ABI selected; the default for the 64-bit ABI is SHmedia, and the
default for the 32-bit ABI is SHcompact. If neither the ABI nor
the ISA is specified, the default is 32-bit SHcompact.
Note that the `.mode' pseudo-op is not permitted if the ISA is not
specified on the command line.
`-abi=32 | -abi=64'
Specify the default ABI. If the ISA is specified and the ABI is
not, the default ABI depends on the ISA, with SHmedia defaulting
to 64-bit and SHcompact defaulting to 32-bit.
Note that the `.abi' pseudo-op is not permitted if the ABI is not
specified on the command line. When the ABI is specified on the
command line, any `.abi' pseudo-ops in the source must match it.
`-shcompact-const-crange'
Emit code-range descriptors for constants in SHcompact code
sections.
`-no-mix'
Disallow SHmedia code in the same section as constants and
SHcompact code.
`-no-expand'
Do not expand MOVI, PT, PTA or PTB instructions.
`-expand-pt32'
With -abi=64, expand PT, PTA and PTB instructions to 32 bits only.

File: as.info, Node: SH64 Syntax, Next: SH64 Directives, Prev: SH64 Options, Up: SH64-Dependent
Syntax
------
* Menu:
* SH64-Chars:: Special Characters
* SH64-Regs:: Register Names
* SH64-Addressing:: Addressing Modes

File: as.info, Node: SH64-Chars, Next: SH64-Regs, Up: SH64 Syntax
Special Characters
..................
`!' is the line comment character.
You can use `;' instead of a newline to separate statements.
Since `$' has no special meaning, you may use it in symbol names.

File: as.info, Node: SH64-Regs, Next: SH64-Addressing, Prev: SH64-Chars, Up: SH64 Syntax
Register Names
..............
You can use the predefined symbols `r0' through `r63' to refer to
the SH64 general registers, `cr0' through `cr63' for control registers,
`tr0' through `tr7' for target address registers, `fr0' through `fr63'
for single-precision floating point registers, `dr0' through `dr62'
(even numbered registers only) for double-precision floating point
registers, `fv0' through `fv60' (multiples of four only) for
single-precision floating point vectors, `fp0' through `fp62' (even
numbered registers only) for single-precision floating point pairs,
`mtrx0' through `mtrx48' (multiples of 16 only) for 4x4 matrices of
single-precision floating point registers, `pc' for the program
counter, and `fpscr' for the floating point status and control register.
You can also refer to the control registers by the mnemonics `sr',
`ssr', `pssr', `intevt', `expevt', `pexpevt', `tra', `spc', `pspc',
`resvec', `vbr', `tea', `dcr', `kcr0', `kcr1', `ctc', and `usr'.

File: as.info, Node: SH64-Addressing, Prev: SH64-Regs, Up: SH64 Syntax
Addressing Modes
................
SH64 operands consist of either a register or immediate value. The
immediate value can be a constant or label reference (or portion of a
label reference), as in this example:
movi 4,r2
pt function, tr4
movi (function >> 16) & 65535,r0
shori function & 65535, r0
ld.l r0,4,r0
Instruction label references can reference labels in either SHmedia
or SHcompact. To differentiate between the two, labels in SHmedia
sections will always have the least significant bit set (i.e. they will
be odd), which SHcompact labels will have the least significant bit
reset (i.e. they will be even). If you need to reference the actual
address of a label, you can use the `datalabel' modifier, as in this
example:
.long function
.long datalabel function
In that example, the first longword may or may not have the least
significant bit set depending on whether the label is an SHmedia label
or an SHcompact label. The second longword will be the actual address
of the label, regardless of what type of label it is.

File: as.info, Node: SH64 Directives, Next: SH64 Opcodes, Prev: SH64 Syntax, Up: SH64-Dependent
SH64 Machine Directives
-----------------------
In addition to the SH directives, the SH64 provides the following
directives:
`.mode [shmedia|shcompact]'
`.isa [shmedia|shcompact]'
Specify the ISA for the following instructions (the two directives
are equivalent). Note that programs such as `objdump' rely on
symbolic labels to determine when such mode switches occur (by
checking the least significant bit of the label's address), so
such mode/isa changes should always be followed by a label (in
practice, this is true anyway). Note that you cannot use these
directives if you didn't specify an ISA on the command line.
`.abi [32|64]'
Specify the ABI for the following instructions. Note that you
cannot use this directive unless you specified an ABI on the
command line, and the ABIs specified must match.
`.uaquad'
Like .uaword and .ualong, this allows you to specify an
intenionally unaligned quadword (64 bit word).