1358 lines
49 KiB
Plaintext
1358 lines
49 KiB
Plaintext
This is Info file as.info, produced by Makeinfo-1.64 from the input
|
||
file ./as.texinfo.
|
||
|
||
START-INFO-DIR-ENTRY
|
||
* As: (as). The GNU assembler.
|
||
END-INFO-DIR-ENTRY
|
||
|
||
This file documents the GNU Assembler "as".
|
||
|
||
Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 Free Software
|
||
Foundation, Inc.
|
||
|
||
Permission is granted to make and distribute verbatim copies of this
|
||
manual provided the copyright notice and this permission notice are
|
||
preserved on all copies.
|
||
|
||
Permission is granted to copy and distribute modified versions of
|
||
this manual under the conditions for verbatim copying, provided that
|
||
the entire resulting derived work is distributed under the terms of a
|
||
permission notice identical to this one.
|
||
|
||
Permission is granted to copy and distribute translations of this
|
||
manual into another language, under the above conditions for modified
|
||
versions.
|
||
|
||
|
||
File: as.info, Node: Top, Next: Overview, Up: (dir)
|
||
|
||
Using as
|
||
********
|
||
|
||
This file is a user guide to the GNU assembler `as'.
|
||
|
||
* Menu:
|
||
|
||
* Overview:: Overview
|
||
* Invoking:: Command-Line Options
|
||
* Syntax:: Syntax
|
||
* Sections:: Sections and Relocation
|
||
* Symbols:: Symbols
|
||
* Expressions:: Expressions
|
||
* Pseudo Ops:: Assembler Directives
|
||
* Machine Dependencies:: Machine Dependent Features
|
||
* Reporting Bugs:: Reporting Bugs
|
||
* Acknowledgements:: Who Did What
|
||
* Index:: Index
|
||
|
||
|
||
File: as.info, Node: Overview, Next: Invoking, Prev: Top, Up: Top
|
||
|
||
Overview
|
||
********
|
||
|
||
Here is a brief summary of how to invoke `as'. For details, *note
|
||
Comand-Line Options: Invoking..
|
||
|
||
as [ -a[cdhlns][=file] ] [ -D ] [ --defsym SYM=VAL ]
|
||
[ -f ] [ --help ] [ -I DIR ] [ -J ] [ -K ] [ -L ]
|
||
[ -o OBJFILE ] [ -R ] [ --statistics ] [ -v ] [ -version ]
|
||
[ --version ] [ -W ] [ -w ] [ -x ] [ -Z ]
|
||
[ -O ]
|
||
|
||
[ -Av6 | -Av7 | -Av8 | -Asparclet | -Asparclite | -Av9 | -Av9a ]
|
||
[ -xarch=v8plus | -xarch=v8plusa ] [ -bump ]
|
||
[ -ACA | -ACA_A | -ACB | -ACC | -AKA | -AKB | -AKC | -AMC ]
|
||
[ -b ] [ -no-relax ]
|
||
[ -l ] [ -m68000 | -m68010 | -m68020 | ... ]
|
||
[ -nocpp ] [ -EL ] [ -EB ] [ -G NUM ] [ -mcpu=CPU ]
|
||
[ -mips1 ] [ -mips2 ] [ -mips3 ] [ -m4650 ] [ -no-m4650 ]
|
||
[ --trap ] [ --break ]
|
||
[ --emulation=NAME ]
|
||
[ -- | FILES ... ]
|
||
|
||
`-a[dhlns]'
|
||
Turn on listings, in any of a variety of ways:
|
||
|
||
`-ad'
|
||
omit debugging directives
|
||
|
||
`-ah'
|
||
include high-level source
|
||
|
||
`-al'
|
||
include assembly
|
||
|
||
`-an'
|
||
omit forms processing
|
||
|
||
`-as'
|
||
include symbols
|
||
|
||
`=file'
|
||
set the name of the listing file
|
||
|
||
You may combine these options; for example, use `-aln' for assembly
|
||
listing without forms processing. The `=file' option, if used,
|
||
must be the last one. By itself, `-a' defaults to `-ahls'--that
|
||
is, all listings turned on.
|
||
|
||
`-D'
|
||
Ignored. This option is accepted for script compatibility with
|
||
calls to other assemblers.
|
||
|
||
`--defsym SYM=VALUE'
|
||
Define the symbol SYM to be VALUE before assembling the input file.
|
||
VALUE must be an integer constant. As in C, a leading `0x'
|
||
indicates a hexadecimal value, and a leading `0' indicates an
|
||
octal value.
|
||
|
||
`-f'
|
||
"fast"--skip whitespace and comment preprocessing (assume source is
|
||
compiler output).
|
||
|
||
`--help'
|
||
Print a summary of the command line options and exit.
|
||
|
||
`-I DIR'
|
||
Add directory DIR to the search list for `.include' directives.
|
||
|
||
`-J'
|
||
Don't warn about signed overflow.
|
||
|
||
`-K'
|
||
Issue warnings when difference tables altered for long
|
||
displacements.
|
||
|
||
`-L'
|
||
Keep (in the symbol table) local symbols, starting with `L'.
|
||
|
||
`-o OBJFILE'
|
||
Name the object-file output from `as' OBJFILE.
|
||
|
||
`-R'
|
||
Fold the data section into the text section.
|
||
|
||
`--statistics'
|
||
Print the maximum space (in bytes) and total time (in seconds)
|
||
used by assembly.
|
||
|
||
`-v'
|
||
`-version'
|
||
Print the `as' version.
|
||
|
||
`--version'
|
||
Print the `as' version and exit.
|
||
|
||
`-W'
|
||
Suppress warning messages.
|
||
|
||
`-w'
|
||
Ignored.
|
||
|
||
`-x'
|
||
Ignored.
|
||
|
||
`-Z'
|
||
Generate an object file even after errors.
|
||
|
||
`-- | FILES ...'
|
||
Standard input, or source files to assemble.
|
||
|
||
The following options are available when as is configured for a D10V
|
||
processor.
|
||
`-O'
|
||
Optimize output by parallelizing instructions.
|
||
|
||
The following options are available when as is configured for the
|
||
Intel 80960 processor.
|
||
|
||
`-ACA | -ACA_A | -ACB | -ACC | -AKA | -AKB | -AKC | -AMC'
|
||
Specify which variant of the 960 architecture is the target.
|
||
|
||
`-b'
|
||
Add code to collect statistics about branches taken.
|
||
|
||
`-no-relax'
|
||
Do not alter compare-and-branch instructions for long
|
||
displacements; error if necessary.
|
||
|
||
The following options are available when as is configured for the
|
||
Motorola 68000 series.
|
||
|
||
`-l'
|
||
Shorten references to undefined symbols, to one word instead of
|
||
two.
|
||
|
||
`-m68000 | -m68008 | -m68010 | -m68020 | -m68030 | -m68040 | -m68060'
|
||
`| -m68302 | -m68331 | -m68332 | -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.
|
||
|
||
`-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.
|
||
|
||
`-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.
|
||
|
||
The following options are available when `as' is configured for the
|
||
SPARC architecture:
|
||
|
||
`-Av6 | -Av7 | -Av8 | -Asparclet | -Asparclite | -Av9 | -Av9a'
|
||
Explicitly select a variant of the SPARC architecture.
|
||
|
||
`-xarch=v8plus | -xarch=v8plusa'
|
||
For compatibility with the Solaris v9 assembler. These options are
|
||
equivalent to -Av9 and -Av9a, respectively.
|
||
|
||
`-bump'
|
||
Warn when the assembler switches to another architecture.
|
||
|
||
The following options are available when as is configured for a MIPS
|
||
processor.
|
||
|
||
`-G NUM'
|
||
This option sets the largest size of an object that can be
|
||
referenced implicitly with the `gp' register. It is only accepted
|
||
for targets that use ECOFF format, such as a DECstation running
|
||
Ultrix. The default value is 8.
|
||
|
||
`-EB'
|
||
Generate "big endian" format output.
|
||
|
||
`-EL'
|
||
Generate "little endian" format output.
|
||
|
||
`-mips1'
|
||
`-mips2'
|
||
`-mips3'
|
||
Generate code for a particular MIPS Instruction Set Architecture
|
||
level. `-mips1' corresponds to the R2000 and R3000 processors,
|
||
`-mips2' to the R6000 processor, and `-mips3' to the R4000
|
||
processor.
|
||
|
||
`-m4650'
|
||
`-no-m4650'
|
||
Generate code for the MIPS R4650 chip. This tells the assembler
|
||
to accept the `mad' and `madu' instruction, and to not schedule
|
||
`nop' instructions around accesses to the `HI' and `LO' registers.
|
||
`-no-m4650' turns off this option.
|
||
|
||
`-mcpu=CPU'
|
||
Generate code for a particular MIPS cpu. This has little effect
|
||
on the assembler, but it is passed by `gcc'.
|
||
|
||
`--emulation=NAME'
|
||
This option causes `as' to emulated `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:
|
||
`mipsecoff', `mipself', `mipslecoff', `mipsbecoff', `mipslelf',
|
||
`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 `b' or `l' in the name. Using `-EB' or `-EL'
|
||
will override the endianness selection in any case.
|
||
|
||
This option is currently supported only when the primary target
|
||
`as' is configured for is a MIPS ELF or ECOFF target.
|
||
Furthermore, the primary target or others specified with
|
||
`--enable-targets=...' 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.
|
||
|
||
`-nocpp'
|
||
`as' ignores this option. It is accepted for compatibility with
|
||
the native tools.
|
||
|
||
`--trap'
|
||
`--no-trap'
|
||
`--break'
|
||
`--no-break'
|
||
Control how to deal with multiplication overflow and division by
|
||
zero. `--trap' or `--no-break' (which are synonyms) take a trap
|
||
exception (and only work for Instruction Set Architecture level 2
|
||
and higher); `--break' or `--no-trap' (also synonyms, and the
|
||
default) take a break exception.
|
||
|
||
* 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
|
||
|
||
|
||
File: as.info, Node: Manual, Next: GNU Assembler, Up: Overview
|
||
|
||
Structure of this Manual
|
||
========================
|
||
|
||
This manual is intended to describe what you need to know to use GNU
|
||
`as'. We cover the syntax expected in source files, including notation
|
||
for symbols, constants, and expressions; the directives that `as'
|
||
understands; and of course how to invoke `as'.
|
||
|
||
This manual also describes some of the machine-dependent features of
|
||
various flavors of the assembler.
|
||
|
||
On the other hand, this manual is *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 *not* describe the instruction set, standard
|
||
mnemonics, registers or addressing modes that are standard to a
|
||
particular architecture. You may want to consult the manufacturer's
|
||
machine architecture manual for this information.
|
||
|
||
|
||
File: as.info, Node: GNU Assembler, Next: Object Formats, Prev: Manual, Up: Overview
|
||
|
||
The GNU Assembler
|
||
=================
|
||
|
||
GNU `as' is really a family of assemblers. If you use (or have
|
||
used) the 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 "pseudo-ops") and
|
||
assembler syntax.
|
||
|
||
`as' is primarily intended to assemble the output of the GNU C
|
||
compiler `gcc' for use by the linker `ld'. Nevertheless, we've tried
|
||
to make `as' assemble correctly everything that other assemblers for
|
||
the same machine would assemble. Any exceptions are documented
|
||
explicitly (*note Machine Dependencies::.). This doesn't mean `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.
|
||
|
||
Unlike older assemblers, `as' is designed to assemble a source
|
||
program in one pass of the source file. This has a subtle impact on the
|
||
`.org' directive (*note `.org': Org.).
|
||
|
||
|
||
File: as.info, Node: Object Formats, Next: Command Line, Prev: GNU Assembler, Up: Overview
|
||
|
||
Object File Formats
|
||
===================
|
||
|
||
The 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. *Note Symbol
|
||
Attributes: Symbol Attributes.
|
||
|
||
|
||
File: as.info, Node: Command Line, Next: Input Files, Prev: Object Formats, Up: Overview
|
||
|
||
Command Line
|
||
============
|
||
|
||
After the program name `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.
|
||
|
||
`--' (two hyphens) by itself names the standard input file
|
||
explicitly, as one of the files for `as' to assemble.
|
||
|
||
Except for `--' any command line argument that begins with a hyphen
|
||
(`-') is an option. Each option changes the behavior of `as'. No
|
||
option changes the way another option works. An option is a `-'
|
||
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 (GNU
|
||
standard). These two command lines are equivalent:
|
||
|
||
as -o my-object-file.o mumble.s
|
||
as -omy-object-file.o mumble.s
|
||
|
||
|
||
File: as.info, Node: Input Files, Next: Object, Prev: Command Line, Up: Overview
|
||
|
||
Input Files
|
||
===========
|
||
|
||
We use the phrase "source program", abbreviated "source", to
|
||
describe the program input to one run of `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.
|
||
|
||
The source program is a concatenation of the text in all the files,
|
||
in the order specified.
|
||
|
||
Each time you run `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 `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 `as' no file names it attempts to read one input file
|
||
from the `as' standard input, which is normally your terminal. You may
|
||
have to type ctl-D to tell `as' there is no more program to assemble.
|
||
|
||
Use `--' if you need to explicitly name the standard input file in
|
||
your command line.
|
||
|
||
If the source is empty, `as' produces a small, empty object file.
|
||
|
||
Filenames and Line-numbers
|
||
--------------------------
|
||
|
||
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. *Note Error and Warning Messages: Errors.
|
||
|
||
"Physical files" are those files named in the command line given to
|
||
`as'.
|
||
|
||
"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 `as' source
|
||
is itself synthesized from other files. *Note `.app-file': App-File.
|
||
|
||
|
||
File: as.info, Node: Object, Next: Errors, Prev: Input Files, Up: Overview
|
||
|
||
Output (Object) File
|
||
====================
|
||
|
||
Every time you run `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 `a.out', or `b.out' when `as' is
|
||
configured for the Intel 80960. You can give it another name by using
|
||
the `-o' option. Conventionally, object file names end with `.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 `a.out' format.)
|
||
|
||
The object file is meant for input to the linker `ld'. It contains
|
||
assembled program code, information to help `ld' integrate the
|
||
assembled program into a runnable file, and (optionally) symbolic
|
||
information for the debugger.
|
||
|
||
|
||
File: as.info, Node: Errors, Prev: Object, Up: Overview
|
||
|
||
Error and Warning Messages
|
||
==========================
|
||
|
||
`as' may write warnings and error messages to the standard error
|
||
file (usually your terminal). This should not happen when a compiler
|
||
runs `as' automatically. Warnings report an assumption made so that
|
||
`as' could keep assembling a flawed program; errors report a grave
|
||
problem that stops the assembly.
|
||
|
||
Warning messages have the format
|
||
|
||
file_name:NNN:Warning Message Text
|
||
|
||
(where NNN is a line number). If a logical file name has been given
|
||
(*note `.app-file': App-File.) it is used for the filename, otherwise
|
||
the name of the current input file is used. If a logical line number
|
||
was given (*note `.line': Line.) 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).
|
||
|
||
Error messages have the format
|
||
file_name:NNN:FATAL:Error Message Text
|
||
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.
|
||
|
||
|
||
File: as.info, Node: Invoking, Next: Syntax, Prev: Overview, Up: Top
|
||
|
||
Command-Line Options
|
||
********************
|
||
|
||
This chapter describes command-line options available in *all*
|
||
versions of the GNU assembler; *note Machine Dependencies::., for
|
||
options specific to particular machine architectures.
|
||
|
||
If you are invoking `as' via the GNU C compiler (version 2), you can
|
||
use the `-Wa' option to pass arguments through to the assembler. The
|
||
assembler arguments must be separated from each other (and the `-Wa')
|
||
by commas. For example:
|
||
|
||
gcc -c -g -O -Wa,-alh,-L file.c
|
||
|
||
emits a listing to standard output with high-level and assembly source.
|
||
|
||
Usually you do not need to use this `-Wa' mechanism, since many
|
||
compiler command-line options are automatically passed to the assembler
|
||
by the compiler. (You can call the GNU compiler driver with the `-v'
|
||
option to see precisely what options it passes to each compilation
|
||
pass, including the assembler.)
|
||
|
||
* Menu:
|
||
|
||
* a:: -a[cdhlns] enable listings
|
||
* D:: -D for compatibility
|
||
* f:: -f to work faster
|
||
* I:: -I for .include search path
|
||
|
||
* K:: -K for difference tables
|
||
|
||
* L:: -L to retain local labels
|
||
* M:: -M or -mri to assemble in MRI compatibility mode
|
||
* o:: -o to name the object file
|
||
* R:: -R to join data and text sections
|
||
* statistics:: -statistics to see statistics about assembly
|
||
* v:: -v to announce version
|
||
* W:: -W to suppress warnings
|
||
* Z:: -Z to make object file even after errors
|
||
|
||
|
||
File: as.info, Node: a, Next: D, Up: Invoking
|
||
|
||
Enable Listings: `-a[cdhlns]'
|
||
=============================
|
||
|
||
These options enable listing output from the assembler. By itself,
|
||
`-a' requests high-level, assembly, and symbols listing. You can use
|
||
other letters to select specific options for the list: `-ah' requests a
|
||
high-level language listing, `-al' requests an output-program assembly
|
||
listing, and `-as' requests a symbol table listing. High-level
|
||
listings require that a compiler debugging option like `-g' be used,
|
||
and that assembly listings (`-al') be requested also.
|
||
|
||
Use the `-ac' option to omit false conditionals from a listing. Any
|
||
lines which are not assembled because of a false `.if' (or `.ifdef', or
|
||
any other conditional), or a true `.if' followed by an `.else', will be
|
||
omitted from the listing.
|
||
|
||
Use the `-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 `.list',
|
||
`.nolist', `.psize', `.eject', `.title', and `.sbttl'. The `-an'
|
||
option turns off all forms processing. If you do not request listing
|
||
output with one of the `-a' options, the listing-control directives
|
||
have no effect.
|
||
|
||
The letters after `-a' may be combined into one option, *e.g.*,
|
||
`-aln'.
|
||
|
||
|
||
File: as.info, Node: D, Next: f, Prev: a, Up: Invoking
|
||
|
||
`-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
|
||
`as'.
|
||
|
||
|
||
File: as.info, Node: f, Next: I, Prev: D, Up: Invoking
|
||
|
||
Work Faster: `-f'
|
||
=================
|
||
|
||
`-f' should only be used when assembling programs written by a
|
||
(trusted) compiler. `-f' stops the assembler from doing whitespace and
|
||
comment preprocessing on the input file(s) before assembling them.
|
||
*Note Preprocessing: Preprocessing.
|
||
|
||
*Warning:* if you use `-f' when the files actually need to be
|
||
preprocessed (if they contain comments, for example), `as' does
|
||
not work correctly.
|
||
|
||
|
||
File: as.info, Node: I, Next: K, Prev: f, Up: Invoking
|
||
|
||
`.include' search path: `-I' PATH
|
||
=================================
|
||
|
||
Use this option to add a PATH to the list of directories `as'
|
||
searches for files specified in `.include' directives (*note
|
||
`.include': Include.). You may use `-I' as many times as necessary to
|
||
include a variety of paths. The current working directory is always
|
||
searched first; after that, `as' searches any `-I' directories in the
|
||
same order as they were specified (left to right) on the command line.
|
||
|
||
|
||
File: as.info, Node: K, Next: L, Prev: I, Up: Invoking
|
||
|
||
Difference Tables: `-K'
|
||
=======================
|
||
|
||
`as' sometimes alters the code emitted for directives of the form
|
||
`.word SYM1-SYM2'; *note `.word': Word.. You can use the `-K' option
|
||
if you want a warning issued when this is done.
|
||
|
||
|
||
File: as.info, Node: L, Next: M, Prev: K, Up: Invoking
|
||
|
||
Include Local Labels: `-L'
|
||
==========================
|
||
|
||
Labels beginning with `L' (upper case only) are called "local
|
||
labels". *Note Symbol Names::. Normally you do not see such labels when
|
||
debugging, because they are intended for the use of programs (like
|
||
compilers) that compose assembler programs, not for your notice.
|
||
Normally both `as' and `ld' discard such labels, so you do not normally
|
||
debug with them.
|
||
|
||
This option tells `as' to retain those `L...' symbols in the object
|
||
file. Usually if you do this you also tell the linker `ld' to preserve
|
||
symbols whose names begin with `L'.
|
||
|
||
By default, a local label is any label beginning with `L', but each
|
||
target is allowed to redefine the local label prefix. On the HPPA
|
||
local labels begin with `L$'.
|
||
|
||
|
||
File: as.info, Node: M, Next: o, Prev: L, Up: Invoking
|
||
|
||
Assemble in MRI Compatibility Mode: `-M'
|
||
========================================
|
||
|
||
The `-M' or `--mri' option selects MRI compatibility mode. This
|
||
changes the syntax and pseudo-op handling of `as' to make it compatible
|
||
with the `ASM68K' or the `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 `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:
|
||
|
||
* 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.
|
||
`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.
|
||
|
||
* 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.
|
||
|
||
* `END' pseudo-op specifying start address
|
||
|
||
The MRI `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 `-e' option to
|
||
the linker, or in a linker script.
|
||
|
||
* `IDNT', `.ident' and `NAME' pseudo-ops
|
||
|
||
The MRI `IDNT', `.ident' and `NAME' pseudo-ops assign a module
|
||
name to the output file. This is not supported by other object
|
||
file formats.
|
||
|
||
* `ORG' pseudo-op
|
||
|
||
The m68k MRI `ORG' pseudo-op begins an absolute section at a given
|
||
address. This differs from the usual `as' `.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.
|
||
|
||
There are some other features of the MRI assembler which are not
|
||
supported by `as', typically either because they are difficult or
|
||
because they seem of little consequence. Some of these may be
|
||
supported in future releases.
|
||
|
||
* EBCDIC strings
|
||
|
||
EBCDIC strings are not supported.
|
||
|
||
* packed binary coded decimal
|
||
|
||
Packed binary coded decimal is not supported. This means that the
|
||
`DC.P' and `DCB.P' pseudo-ops are not supported.
|
||
|
||
* `FEQU' pseudo-op
|
||
|
||
The m68k `FEQU' pseudo-op is not supported.
|
||
|
||
* `NOOBJ' pseudo-op
|
||
|
||
The m68k `NOOBJ' pseudo-op is not supported.
|
||
|
||
* `OPT' branch control options
|
||
|
||
The m68k `OPT' branch control options--`B', `BRS', `BRB', `BRL',
|
||
and `BRW'--are ignored. `as' automatically relaxes all branches,
|
||
whether forward or backward, to an appropriate size, so these
|
||
options serve no purpose.
|
||
|
||
* `OPT' list control options
|
||
|
||
The following m68k `OPT' list control options are ignored: `C',
|
||
`CEX', `CL', `CRE', `E', `G', `I', `M', `MEX', `MC', `MD', `X'.
|
||
|
||
* other `OPT' options
|
||
|
||
The following m68k `OPT' options are ignored: `NEST', `O', `OLD',
|
||
`OP', `P', `PCO', `PCR', `PCS', `R'.
|
||
|
||
* `OPT' `D' option is default
|
||
|
||
The m68k `OPT' `D' option is the default, unlike the MRI assembler.
|
||
`OPT NOD' may be used to turn it off.
|
||
|
||
* `XREF' pseudo-op.
|
||
|
||
The m68k `XREF' pseudo-op is ignored.
|
||
|
||
* `.debug' pseudo-op
|
||
|
||
The i960 `.debug' pseudo-op is not supported.
|
||
|
||
* `.extended' pseudo-op
|
||
|
||
The i960 `.extended' pseudo-op is not supported.
|
||
|
||
* `.list' pseudo-op.
|
||
|
||
The various options of the i960 `.list' pseudo-op are not
|
||
supported.
|
||
|
||
* `.optimize' pseudo-op
|
||
|
||
The i960 `.optimize' pseudo-op is not supported.
|
||
|
||
* `.output' pseudo-op
|
||
|
||
The i960 `.output' pseudo-op is not supported.
|
||
|
||
* `.setreal' pseudo-op
|
||
|
||
The i960 `.setreal' pseudo-op is not supported.
|
||
|
||
|
||
File: as.info, Node: o, Next: R, Prev: M, Up: Invoking
|
||
|
||
Name the Object File: `-o'
|
||
==========================
|
||
|
||
There is always one object file output when you run `as'. By
|
||
default it has the name `a.out' (or `b.out', for Intel 960 targets
|
||
only). You use this option (which takes exactly one filename) to give
|
||
the object file a different name.
|
||
|
||
Whatever the object file is called, `as' overwrites any existing
|
||
file of the same name.
|
||
|
||
|
||
File: as.info, Node: R, Next: statistics, Prev: o, Up: Invoking
|
||
|
||
Join Data and Text Sections: `-R'
|
||
=================================
|
||
|
||
`-R' tells `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. (*Note
|
||
Sections and Relocation: Sections.)
|
||
|
||
When you specify `-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 `as'. In future, `-R' may work this way.
|
||
|
||
When `as' is configured for COFF output, this option is only useful
|
||
if you use sections named `.text' and `.data'.
|
||
|
||
`-R' is not supported for any of the HPPA targets. Using `-R'
|
||
generates a warning from `as'.
|
||
|
||
|
||
File: as.info, Node: statistics, Next: v, Prev: R, Up: Invoking
|
||
|
||
Display Assembly Statistics: `--statistics'
|
||
===========================================
|
||
|
||
Use `--statistics' to display two statistics about the resources
|
||
used by `as': the maximum amount of space allocated during the assembly
|
||
(in bytes), and the total execution time taken for the assembly (in CPU
|
||
seconds).
|
||
|
||
|
||
File: as.info, Node: v, Next: W, Prev: statistics, Up: Invoking
|
||
|
||
Announce Version: `-v'
|
||
======================
|
||
|
||
You can find out what version of as is running by including the
|
||
option `-v' (which you can also spell as `-version') on the command
|
||
line.
|
||
|
||
|
||
File: as.info, Node: W, Next: Z, Prev: v, Up: Invoking
|
||
|
||
Suppress Warnings: `-W'
|
||
=======================
|
||
|
||
`as' should never give a warning or error message when assembling
|
||
compiler output. But programs written by people often cause `as' to
|
||
give a warning that a particular assumption was made. All such
|
||
warnings are directed to the standard error file. If you use this
|
||
option, no warnings are issued. This option only affects the warning
|
||
messages: it does not change any particular of how `as' assembles your
|
||
file. Errors, which stop the assembly, are still reported.
|
||
|
||
|
||
File: as.info, Node: Z, Prev: W, Up: Invoking
|
||
|
||
Generate Object File in Spite of Errors: `-Z'
|
||
=============================================
|
||
|
||
After an error message, `as' normally produces no output. If for
|
||
some reason you are interested in object file output even after `as'
|
||
gives an error message on your program, use the `-Z' option. If there
|
||
are any errors, `as' continues anyways, and writes an object file after
|
||
a final warning message of the form `N errors, M warnings, generating
|
||
bad object file.'
|
||
|
||
|
||
File: as.info, Node: Syntax, Next: Sections, Prev: Invoking, Up: Top
|
||
|
||
Syntax
|
||
******
|
||
|
||
This chapter describes the machine-independent syntax allowed in a
|
||
source file. `as' syntax is similar to what many other assemblers use;
|
||
it is inspired by the BSD 4.2 assembler, except that `as' does not
|
||
assemble Vax bit-fields.
|
||
|
||
* Menu:
|
||
|
||
* Preprocessing:: Preprocessing
|
||
* Whitespace:: Whitespace
|
||
* Comments:: Comments
|
||
* Symbol Intro:: Symbols
|
||
* Statements:: Statements
|
||
* Constants:: Constants
|
||
|
||
|
||
File: as.info, Node: Preprocessing, Next: Whitespace, Up: Syntax
|
||
|
||
Preprocessing
|
||
=============
|
||
|
||
The `as' internal preprocessor:
|
||
* 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.
|
||
|
||
* removes all comments, replacing them with a single space, or an
|
||
appropriate number of newlines.
|
||
|
||
* converts character constants into the appropriate numeric values.
|
||
|
||
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 `.include' directive (*note
|
||
`.include': Include.). You can use the GNU C compiler driver to get
|
||
other "CPP" style preprocessing, by giving the input file a `.S'
|
||
suffix. *Note Options Controlling the Kind of Output:
|
||
(gcc.info)Overall Options.
|
||
|
||
Excess whitespace, comments, and character constants cannot be used
|
||
in the portions of the input text that are not preprocessed.
|
||
|
||
If the first line of an input file is `#NO_APP' or if you use the
|
||
`-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 `#APP'
|
||
before the text that may contain whitespace or comments, and putting a
|
||
line that says `#NO_APP' after this text. This feature is mainly
|
||
intend to support `asm' statements in compilers whose output is
|
||
otherwise free of comments and whitespace.
|
||
|
||
|
||
File: as.info, Node: Whitespace, Next: Comments, Prev: Preprocessing, Up: Syntax
|
||
|
||
Whitespace
|
||
==========
|
||
|
||
"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 (*note Character
|
||
Constants: Characters.), any whitespace means the same as exactly one
|
||
space.
|
||
|
||
|
||
File: as.info, Node: Comments, Next: Symbol Intro, Prev: Whitespace, Up: Syntax
|
||
|
||
Comments
|
||
========
|
||
|
||
There are two ways of rendering comments to `as'. In both cases the
|
||
comment is equivalent to one space.
|
||
|
||
Anything from `/*' through the next `*/' is a comment. This means
|
||
you may not nest these comments.
|
||
|
||
/*
|
||
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. */
|
||
|
||
Anything from the "line comment" character to the next newline is
|
||
considered a comment and is ignored. The line comment character is `;'
|
||
for the AMD 29K family; `;' for the H8/300 family; `!' for the H8/500
|
||
family; `;' for the HPPA; `#' on the i960; `!' for the Hitachi SH; `!'
|
||
on the SPARC; `|' on the 680x0; `#' on the Vax; `!' for the Z8000; see
|
||
*Note Machine Dependencies::.
|
||
|
||
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.
|
||
|
||
To be compatible with past assemblers, lines that begin with `#'
|
||
have a special interpretation. Following the `#' should be an absolute
|
||
expression (*note Expressions::.): the logical line number of the *next*
|
||
line. Then a string (*note 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.)
|
||
|
||
# This is an ordinary comment.
|
||
# 42-6 "new_file_name" # New logical file name
|
||
# This is logical line # 36.
|
||
This feature is deprecated, and may disappear from future versions
|
||
of `as'.
|
||
|
||
|
||
File: as.info, Node: Symbol Intro, Next: Statements, Prev: Comments, Up: Syntax
|
||
|
||
Symbols
|
||
=======
|
||
|
||
A "symbol" is one or more characters chosen from the set of all
|
||
letters (both upper and lower case), digits and the three characters
|
||
`_.$'. On most machines, you can also use `$' in symbol names;
|
||
exceptions are noted in *Note Machine Dependencies::. 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). *Note Symbols::.
|
||
|
||
|
||
File: as.info, Node: Statements, Next: Constants, Prev: Symbol Intro, Up: Syntax
|
||
|
||
Statements
|
||
==========
|
||
|
||
A "statement" ends at a newline character (`\n') or line separator
|
||
character. (The line separator is usually `;', unless this conflicts
|
||
with the comment character; *note 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.
|
||
|
||
It is an error to end any statement with end-of-file: the last
|
||
character of any input file should be a newline.
|
||
|
||
You may write a statement on more than one line if you put a
|
||
backslash (`\') immediately in front of any newlines within the
|
||
statement. When `as' reads a backslashed newline both characters are
|
||
ignored. You can even put backslashed newlines in the middle of symbol
|
||
names without changing the meaning of your source program.
|
||
|
||
An empty statement is allowed, and may include whitespace. It is
|
||
ignored.
|
||
|
||
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 `.' 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 "instruction": it
|
||
assembles into a machine language instruction. Different versions of
|
||
`as' for different computers recognize different instructions. In
|
||
fact, the same symbol may represent a different instruction in a
|
||
different computer's assembly language.
|
||
|
||
A label is a symbol immediately followed by a colon (`:').
|
||
Whitespace before a label or after a colon is permitted, but you may not
|
||
have whitespace between a label's symbol and its colon. *Note Labels::.
|
||
|
||
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.
|
||
|
||
label: .directive followed by something
|
||
another_label: # This is an empty statement.
|
||
instruction operand_1, operand_2, ...
|
||
|
||
|
||
File: as.info, Node: Constants, Prev: Statements, Up: Syntax
|
||
|
||
Constants
|
||
=========
|
||
|
||
A constant is a number, written so that its value is known by
|
||
inspection, without knowing any context. Like this:
|
||
.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.
|
||
|
||
* Menu:
|
||
|
||
* Characters:: Character Constants
|
||
* Numbers:: Number Constants
|
||
|
||
|
||
File: as.info, Node: Characters, Next: Numbers, Up: Constants
|
||
|
||
Character Constants
|
||
-------------------
|
||
|
||
There are two kinds of character constants. A "character" stands
|
||
for one character in one byte and its value may be used in numeric
|
||
expressions. String constants (properly called string *literals*) are
|
||
potentially many bytes and their values may not be used in arithmetic
|
||
expressions.
|
||
|
||
* Menu:
|
||
|
||
* Strings:: Strings
|
||
* Chars:: Characters
|
||
|
||
|
||
File: as.info, Node: Strings, Next: Chars, Up: Characters
|
||
|
||
Strings
|
||
.......
|
||
|
||
A "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 "escape" these characters: precede them with a
|
||
backslash `\' character. For example `\\' represents one backslash:
|
||
the first `\' is an escape which tells `as' to interpret the second
|
||
character literally as a backslash (which prevents `as' from
|
||
recognizing the second `\' as an escape character). The complete list
|
||
of escapes follows.
|
||
|
||
`\b'
|
||
Mnemonic for backspace; for ASCII this is octal code 010.
|
||
|
||
`\f'
|
||
Mnemonic for FormFeed; for ASCII this is octal code 014.
|
||
|
||
`\n'
|
||
Mnemonic for newline; for ASCII this is octal code 012.
|
||
|
||
`\r'
|
||
Mnemonic for carriage-Return; for ASCII this is octal code 015.
|
||
|
||
`\t'
|
||
Mnemonic for horizontal Tab; for ASCII this is octal code 011.
|
||
|
||
`\ DIGIT DIGIT 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, `\008' has the value 010, and `\009' the
|
||
value 011.
|
||
|
||
`\`x' HEX-DIGITS...'
|
||
A hex character code. All trailing hex digits are combined.
|
||
Either upper or lower case `x' works.
|
||
|
||
`\\'
|
||
Represents one `\' character.
|
||
|
||
`\"'
|
||
Represents one `"' character. Needed in strings to represent this
|
||
character, because an unescaped `"' would end the string.
|
||
|
||
`\ ANYTHING-ELSE'
|
||
Any other character when escaped by `\' gives a warning, but
|
||
assembles as if the `\' 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 `as' has no
|
||
other interpretation, so `as' knows it is giving you the wrong
|
||
code and warns you of the fact.
|
||
|
||
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.
|
||
|
||
|
||
File: as.info, Node: Chars, Prev: Strings, Up: Characters
|
||
|
||
Characters
|
||
..........
|
||
|
||
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 `'\\' where the first `\' escapes the second `\'. As you can
|
||
see, the quote is an acute accent, not a grave accent. A newline
|
||
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. `as' assumes your character code is ASCII: `'A' means
|
||
65, `'B' means 66, and so on.
|
||
|
||
|
||
File: as.info, Node: Numbers, Prev: Characters, Up: Constants
|
||
|
||
Number Constants
|
||
----------------
|
||
|
||
`as' distinguishes three kinds of numbers according to how they are
|
||
stored in the target machine. *Integers* are numbers that would fit
|
||
into an `int' in the C language. *Bignums* are integers, but they are
|
||
stored in more than 32 bits. *Flonums* are floating point numbers,
|
||
described below.
|
||
|
||
* Menu:
|
||
|
||
* Integers:: Integers
|
||
* Bignums:: Bignums
|
||
* Flonums:: Flonums
|
||
|
||
|
||
File: as.info, Node: Integers, Next: Bignums, Up: Numbers
|
||
|
||
Integers
|
||
........
|
||
|
||
A binary integer is `0b' or `0B' followed by zero or more of the
|
||
binary digits `01'.
|
||
|
||
An octal integer is `0' followed by zero or more of the octal digits
|
||
(`01234567').
|
||
|
||
A decimal integer starts with a non-zero digit followed by zero or
|
||
more digits (`0123456789').
|
||
|
||
A hexadecimal integer is `0x' or `0X' followed by one or more
|
||
hexadecimal digits chosen from `0123456789abcdefABCDEF'.
|
||
|
||
Integers have the usual values. To denote a negative integer, use
|
||
the prefix operator `-' discussed under expressions (*note Prefix
|
||
Operators: Prefix Ops.).
|
||
|
||
|
||
File: as.info, Node: Bignums, Next: Flonums, Prev: Integers, Up: Numbers
|
||
|
||
Bignums
|
||
.......
|
||
|
||
A "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.
|
||
|
||
|
||
File: as.info, Node: Flonums, Prev: Bignums, Up: Numbers
|
||
|
||
Flonums
|
||
.......
|
||
|
||
A "flonum" represents a floating point number. The translation is
|
||
indirect: a decimal floating point number from the text is converted by
|
||
`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 `as' specialized to that computer.
|
||
|
||
A flonum is written by writing (in order)
|
||
* The digit `0'. (`0' is optional on the HPPA.)
|
||
|
||
* A letter, to tell `as' the rest of the number is a flonum. `e' is
|
||
recommended. Case is not important.
|
||
|
||
On the H8/300, H8/500, Hitachi SH, and AMD 29K architectures, the
|
||
letter must be one of the letters `DFPRSX' (in upper or lower
|
||
case).
|
||
|
||
On the Intel 960 architecture, the letter must be one of the
|
||
letters `DFT' (in upper or lower case).
|
||
|
||
On the HPPA architecture, the letter must be `E' (upper case only).
|
||
|
||
* An optional sign: either `+' or `-'.
|
||
|
||
* An optional "integer part": zero or more decimal digits.
|
||
|
||
* An optional "fractional part": `.' followed by zero or more
|
||
decimal digits.
|
||
|
||
* An optional exponent, consisting of:
|
||
|
||
* An `E' or `e'.
|
||
|
||
* Optional sign: either `+' or `-'.
|
||
|
||
* One or more decimal digits.
|
||
|
||
At least one of the integer part or the fractional part must be
|
||
present. The floating point number has the usual base-10 value.
|
||
|
||
`as' does all processing using integers. Flonums are computed
|
||
independently of any floating point hardware in the computer running
|
||
`as'.
|
||
|
||
|
||
File: as.info, Node: Sections, Next: Symbols, Prev: Syntax, Up: Top
|
||
|
||
Sections and Relocation
|
||
***********************
|
||
|
||
* Menu:
|
||
|
||
* Secs Background:: Background
|
||
* Ld Sections:: Linker Sections
|
||
* As Sections:: Assembler Internal Sections
|
||
* Sub-Sections:: Sub-Sections
|
||
* bss:: bss Section
|
||
|
||
|
||
File: as.info, Node: Secs Background, Next: Ld Sections, Up: Sections
|
||
|
||
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.
|
||
|
||
The linker `ld' reads many object files (partial programs) and
|
||
combines their contents to form a runnable program. When `as' emits an
|
||
object file, the partial program is assumed to start at address 0.
|
||
`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 `as' uses sections.
|
||
|
||
`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 *section*. Assigning
|
||
run-time addresses to sections is called "relocation". It includes the
|
||
task of adjusting mentions of object-file addresses so they refer to
|
||
the proper run-time addresses. For the H8/300 and H8/500, and for the
|
||
Hitachi SH, `as' pads sections if needed to ensure they end on a word
|
||
(sixteen bit) boundary.
|
||
|
||
An object file written by `as' has at least three sections, any of
|
||
which may be empty. These are named "text", "data" and "bss" sections.
|
||
|
||
When it generates COFF output, `as' can also generate whatever other
|
||
named sections you specify using the `.section' directive (*note
|
||
`.section': Section.). If you do not use any directives that place
|
||
output in the `.text' or `.data' sections, these sections still exist,
|
||
but are empty.
|
||
|
||
When `as' generates SOM or ELF output for the HPPA, `as' can also
|
||
generate whatever other named sections you specify using the `.space'
|
||
and `.subspace' directives. See `HP9000 Series 800 Assembly Language
|
||
Reference Manual' (HP 92432-90001) for details on the `.space' and
|
||
`.subspace' assembler directives.
|
||
|
||
Additionally, `as' uses different names for the standard text, data,
|
||
and bss sections when generating SOM output. Program text is placed
|
||
into the `$CODE$' section, data into `$DATA$', and BSS into `$BSS$'.
|
||
|
||
Within the object file, the text section starts at address `0', the
|
||
data section follows, and the bss section follows the data section.
|
||
|
||
When generating either SOM or ELF output files on the HPPA, the text
|
||
section starts at address `0', the data section at address `0x4000000',
|
||
and the bss section follows the data section.
|
||
|
||
To let `ld' know which data changes when the sections are relocated,
|
||
and how to change that data, `as' also writes to the object file
|
||
details of the relocation needed. To perform relocation `ld' must
|
||
know, each time an address in the object file is mentioned:
|
||
* Where in the object file is the beginning of this reference to an
|
||
address?
|
||
|
||
* How long (in bytes) is this reference?
|
||
|
||
* Which section does the address refer to? What is the numeric
|
||
value of
|
||
(ADDRESS) - (START-ADDRESS OF SECTION)?
|
||
|
||
* Is the reference to an address "Program-Counter relative"?
|
||
|
||
In fact, every address `as' ever uses is expressed as
|
||
(SECTION) + (OFFSET INTO SECTION)
|
||
|
||
Further, most expressions `as' computes have this section-relative
|
||
nature. (For some object formats, such as SOM for the HPPA, some
|
||
expressions are symbol-relative instead.)
|
||
|
||
In this manual we use the notation {SECNAME N} to mean "offset N
|
||
into section SECNAME."
|
||
|
||
Apart from text, data and bss sections you need to know about the
|
||
"absolute" section. When `ld' mixes partial programs, addresses in the
|
||
absolute section remain unchanged. For example, address `{absolute 0}'
|
||
is "relocated" to run-time address 0 by `ld'. Although the linker
|
||
never arranges two partial programs' data sections with overlapping
|
||
addresses after linking, *by definition* their absolute sections must
|
||
overlap. Address `{absolute 239}' in one part of a program is always
|
||
the same address when the program is running as address `{absolute
|
||
239}' in any other part of the program.
|
||
|
||
The idea of sections is extended to the "undefined" section. Any
|
||
address whose section is unknown at assembly time is by definition
|
||
rendered {undefined U}--where 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 *undefined*.
|
||
|
||
By analogy the word *section* is used to describe groups of sections
|
||
in the linked program. `ld' puts all partial programs' text sections
|
||
in contiguous addresses in the linked program. It is customary to
|
||
refer to the *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 `ld'; others are invented for use
|
||
of `as' and have no meaning except during assembly.
|
||
|