[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
All assembler directives have names that begin with a period (`.'). The rest of the name is letters, usually in lower case.
This chapter discusses directives that are available regardless of the target machine configuration for the GNU assembler. Some machine configurations provide additional directives. See section 8. Machine Dependent Features.
7.1 .abort
7.2 .ABORT
7.3 .align abs-expr, abs-expr, abs-expr
.align abs-expr , abs-expr
7.4 .ascii "string"
...7.5 .asciz "string"
...7.6 .balign[wl] abs-expr, abs-expr, abs-expr
.balign abs-expr , abs-expr
7.7 .byte expressions
7.8 .comm symbol , length
7.9 .cfi_startproc
.cfi_startproc
,.cfi_endproc
, etc.
7.19 .data subsection
7.20 .def name
7.21 .desc symbol, abs-expression
7.22 .dim
7.23 .double flonums
7.24 .eject
7.25 .else
7.26 .elseif
7.27 .end
7.28 .endef
7.29 .endfunc
7.30 .endif
7.31 .equ symbol, expression
7.32 .equiv symbol, expression
7.33 .err
7.34 .exitm
7.35 .extern
7.36 .fail expression
.fail
7.37 .file string
7.38 .fill repeat , size , value
7.39 .float flonums
7.40 .func name[,label]
.func
7.41 .global symbol
,.globl symbol
7.42 .hidden names
7.43 .hword expressions
7.44 .ident
7.45 .if absolute expression
7.46 .incbin "file"[,skip[,count]]
7.47 .include "file"
7.48 .int expressions
7.49 .internal names
7.50 .irp symbol,values
...7.51 .irpc symbol,values
...7.52 .lcomm symbol , length
7.53 .lflags
7.54 .line line-number
7.56 .ln line-number
7.55 .linkonce [type]
7.58 .list
7.59 .long expressions
7.60 .macro
.macro name args
...7.57 .mri val
7.61 .nolist
7.62 .octa bignums
7.63 .org new-lc , fill
7.64 .p2align[wl] abs-expr, abs-expr, abs-expr
.p2align abs-expr , abs-expr
7.66 .popsection
7.65 .previous
7.67 .print string
7.68 .protected names
7.69 .psize lines , columns
7.70 .purgem name
7.71 .pushsection name , subsection
.pushsection name
7.72 .quad bignums
7.73 .rept count
7.74 .sbttl "subheading"
7.75 .scl class
7.76 .section name
7.77 .set symbol, expression
7.78 .short expressions
7.79 .single flonums
7.80 .size
.size [name , expression]
7.82 .skip size , fill
7.81 .sleb128 expressions
7.83 .space size , fill
7.84 .stabd, .stabn, .stabs
7.85 .string
"str".string "str"
7.86 .struct expression
7.87 .subsection name
.subsection
7.88 .symver
.symver name,name2@nodename
7.89 .tag structname
7.90 .text subsection
7.91 .title "heading"
7.92 .type
.type <int | name , type description>
7.93 .uleb128 expressions
7.94 .val addr
7.95 .version "string"
7.96 .vtable_entry table, offset
7.97 .vtable_inherit child, parent
7.98 .weak names
7.99 .word expressions
7.100 Deprecated Directives
.abort
This directive stops the assembly immediately. It is for
compatibility with other assemblers. The original idea was that the
assembly language source would be piped into the assembler. If the sender
of the source quit, it could use this directive tells as
to
quit also. One day .abort
will not be supported.
.ABORT
When producing COFF output, as
accepts this directive as a
synonym for `.abort'.
When producing b.out
output, as
accepts this directive,
but ignores it.
.align abs-expr, abs-expr, abs-expr
Pad the location counter (in the current subsection) to a particular storage boundary. The first expression (which must be absolute) is the alignment required, as described below.
The second expression (also absolute) gives the fill value to be stored in the padding bytes. It (and the comma) may be omitted. If it is omitted, the padding bytes are normally zero. However, on some systems, if the section is marked as containing code and the fill value is omitted, the space is filled with no-op instructions.
The third expression is also absolute, and is also optional. If it is present, it is the maximum number of bytes that should be skipped by this alignment directive. If doing the alignment would require skipping more bytes than the specified maximum, then the alignment is not done at all. You can omit the fill value (the second argument) entirely by simply using two commas after the required alignment; this can be useful if you want the alignment to be filled with no-op instructions when appropriate.
The way the required alignment is specified varies from system to system. For the a29k, arc, hppa, i386 using ELF, i860, iq2000, m68k, m88k, or32, s390, sparc, tic4x, tic80 and xtensa, the first expression is the alignment request in bytes. For example `.align 8' advances the location counter until it is a multiple of 8. If the location counter is already a multiple of 8, no change is needed. For the tic54x, the first expression is the alignment request in words.
For other systems, including the i386 using a.out format, and the arm and strongarm, it is the number of low-order zero bits the location counter must have after advancement. For example `.align 3' advances the location counter until it a multiple of 8. If the location counter is already a multiple of 8, no change is needed.
This inconsistency is due to the different behaviors of the various
native assemblers for these systems which GAS must emulate.
GAS also provides .balign
and .p2align
directives,
described later, which have a consistent behavior across all
architectures (but are specific to GAS).
.ascii "string"
...
.ascii
expects zero or more string literals (see section 3.6.1.1 Strings)
separated by commas. It assembles each string (with no automatic
trailing zero byte) into consecutive addresses.
.asciz "string"
...
.asciz
is just like .ascii
, but each string is followed by
a zero byte. The "z" in `.asciz' stands for "zero".
.balign[wl] abs-expr, abs-expr, abs-expr
Pad the location counter (in the current subsection) to a particular storage boundary. The first expression (which must be absolute) is the alignment request in bytes. For example `.balign 8' advances the location counter until it is a multiple of 8. If the location counter is already a multiple of 8, no change is needed.
The second expression (also absolute) gives the fill value to be stored in the padding bytes. It (and the comma) may be omitted. If it is omitted, the padding bytes are normally zero. However, on some systems, if the section is marked as containing code and the fill value is omitted, the space is filled with no-op instructions.
The third expression is also absolute, and is also optional. If it is present, it is the maximum number of bytes that should be skipped by this alignment directive. If doing the alignment would require skipping more bytes than the specified maximum, then the alignment is not done at all. You can omit the fill value (the second argument) entirely by simply using two commas after the required alignment; this can be useful if you want the alignment to be filled with no-op instructions when appropriate.
The .balignw
and .balignl
directives are variants of the
.balign
directive. The .balignw
directive treats the fill
pattern as a two byte word value. The .balignl
directives treats the
fill pattern as a four byte longword value. For example, .balignw
4,0x368d
will align to a multiple of 4. If it skips two bytes, they will be
filled in with the value 0x368d (the exact placement of the bytes depends upon
the endianness of the processor). If it skips 1 or 3 bytes, the fill value is
undefined.
.byte expressions
.byte
expects zero or more expressions, separated by commas.
Each expression is assembled into the next byte.
.comm symbol , length
.comm
declares a common symbol named symbol. When linking, a
common symbol in one object file may be merged with a defined or common symbol
of the same name in another object file. If ld
does not see a
definition for the symbol--just one or more common symbols--then it will
allocate length bytes of uninitialized memory. length must be an
absolute expression. If ld
sees multiple common symbols with
the same name, and they do not all have the same size, it will allocate space
using the largest size.
When using ELF, the .comm
directive takes an optional third argument.
This is the desired alignment of the symbol, specified as a byte boundary (for
example, an alignment of 16 means that the least significant 4 bits of the
address should be zero). The alignment must be an absolute expression, and it
must be a power of two. If ld
allocates uninitialized memory
for the common symbol, it will use the alignment when placing the symbol. If
no alignment is specified, as
will set the alignment to the
largest power of two less than or equal to the size of the symbol, up to a
maximum of 16.
The syntax for .comm
differs slightly on the HPPA. The syntax is
`symbol .comm, length'; symbol is optional.
.cfi_startproc
.cfi_startproc
is used at the beginning of each function that
should have an entry in .eh_frame
. It initializes some internal
data structures and emits architecture dependent initial CFI instructions.
Don't forget to close the function by
.cfi_endproc
.
.cfi_endproc
.cfi_endproc
is used at the end of a function where it closes its
unwind entry previously opened by
.cfi_startproc
. and emits it to .eh_frame
.
.cfi_def_cfa register, offset
.cfi_def_cfa
defines a rule for computing CFA as: take
address from register and add offset to it.
.cfi_def_cfa_register register
.cfi_def_cfa_register
modifies a rule for computing CFA. From
now on register will be used instead of the old one. Offset
remains the same.
.cfi_def_cfa_offset offset
.cfi_def_cfa_offset
modifies a rule for computing CFA. Register
remains the same, but offset is new. Note that it is the
absolute offset that will be added to a defined register to compute
CFA address.
.cfi_adjust_cfa_offset offset
.cfi_def_cfa_offset
but offset is a relative
value that is added/substracted from the previous offset.
.cfi_offset register, offset
.cfi_rel_offset register, offset
.cfi_offset
using the known displacement of the CFA register from the CFA.
This is often easier to use, because the number will match the
code it's annotating.
.cfi_window_save
.cfi_escape
expression[, ...] .data subsection
.data
tells as
to assemble the following statements onto the
end of the data subsection numbered subsection (which is an
absolute expression). If subsection is omitted, it defaults
to zero.
.def name
Begin defining debugging information for a symbol name; the
definition extends until the .endef
directive is encountered.
This directive is only observed when as
is configured for COFF
format output; when producing b.out
, `.def' is recognized,
but ignored.
.desc symbol, abs-expression
This directive sets the descriptor of the symbol (see section 5.5 Symbol Attributes) to the low 16 bits of an absolute expression.
The `.desc' directive is not available when as
is
configured for COFF output; it is only for a.out
or b.out
object format. For the sake of compatibility, as
accepts
it, but produces no output, when configured for COFF.
.dim
This directive is generated by compilers to include auxiliary debugging
information in the symbol table. It is only permitted inside
.def
/.endef
pairs.
`.dim' is only meaningful when generating COFF format output; when
as
is generating b.out
, it accepts this directive but
ignores it.
.double flonums
.double
expects zero or more flonums, separated by commas. It
assembles floating point numbers.
The exact kind of floating point numbers emitted depends on how
as
is configured. See section 8. Machine Dependent Features.
.eject
Force a page break at this point, when generating assembly listings.
.else
.else
is part of the as
support for conditional
assembly; see section .if
. It marks the beginning of a section
of code to be assembled if the condition for the preceding .if
was false.
.elseif
.elseif
is part of the as
support for conditional
assembly; see section .if
. It is shorthand for beginning a new
.if
block that would otherwise fill the entire .else
section.
.end
.end
marks the end of the assembly file. as
does not
process anything in the file past the .end
directive.
.endef
This directive flags the end of a symbol definition begun with
.def
.
`.endef' is only meaningful when generating COFF format output; if
as
is configured to generate b.out
, it accepts this
directive but ignores it.
.endfunc
.endfunc
marks the end of a function specified with .func
.
.endif
.endif
is part of the as
support for conditional assembly;
it marks the end of a block of code that is only assembled
conditionally. See section .if
.
.equ symbol, expression
This directive sets the value of symbol to expression.
It is synonymous with `.set'; see section .set
.
The syntax for equ
on the HPPA is
`symbol .equ expression'.
.equiv symbol, expression
.equiv
directive is like .equ
and .set
, except that
the assembler will signal an error if symbol is already defined. Note a
symbol which has been referenced but not actually defined is considered to be
undefined.
Except for the contents of the error message, this is roughly equivalent to
.ifdef SYM .err .endif .equ SYM,VAL |
.err
as
assembles a .err
directive, it will print an error
message and, unless the `-Z' option was used, it will not generate an
object file. This can be used to signal error an conditionally compiled code.
.exitm
.macro
.
.extern
.extern
is accepted in the source program--for compatibility
with other assemblers--but it is ignored. as
treats
all undefined symbols as external.
.fail expression
Generates an error or a warning. If the value of the expression is 500
or more, as
will print a warning message. If the value is less
than 500, as
will print an error message. The message will
include the value of expression. This can occasionally be useful inside
complex nested macros or conditional assembly.
.file string
.file
tells as
that we are about to start a new logical
file. string is the new file name. In general, the filename is
recognized whether or not it is surrounded by quotes `"'; but if you wish
to specify an empty file name, you must give the quotes--""
. This
statement may go away in future: it is only recognized to be compatible with
old as
programs.
In some configurations of as
, .file
has already been
removed to avoid conflicts with other assemblers. See section 8. Machine Dependent Features.
.fill repeat , size , value
repeat, size and value are absolute expressions.
This emits repeat copies of size bytes. Repeat
may be zero or more. Size may be zero or more, but if it is
more than 8, then it is deemed to have the value 8, compatible with
other people's assemblers. The contents of each repeat bytes
is taken from an 8-byte number. The highest order 4 bytes are
zero. The lowest order 4 bytes are value rendered in the
byte-order of an integer on the computer as
is assembling for.
Each size bytes in a repetition is taken from the lowest order
size bytes of this number. Again, this bizarre behavior is
compatible with other people's assemblers.
size and value are optional. If the second comma and value are absent, value is assumed zero. If the first comma and following tokens are absent, size is assumed to be 1.
.float flonums
This directive assembles zero or more flonums, separated by commas. It
has the same effect as .single
.
The exact kind of floating point numbers emitted depends on how
as
is configured.
See section 8. Machine Dependent Features.
.func name[,label]
.func
emits debugging information to denote function name, and
is ignored unless the file is assembled with debugging enabled.
Only `--gstabs[+]' is currently supported.
label is the entry point of the function and if omitted name
prepended with the `leading char' is used.
`leading char' is usually _
or nothing, depending on the target.
All functions are currently defined to have void
return type.
The function must be terminated with .endfunc
.
.global symbol
, .globl symbol
.global
makes the symbol visible to ld
. If you define
symbol in your partial program, its value is made available to
other partial programs that are linked with it. Otherwise,
symbol takes its attributes from a symbol of the same name
from another file linked into the same program.
Both spellings (`.globl' and `.global') are accepted, for compatibility with other assemblers.
On the HPPA, .global
is not always enough to make it accessible to other
partial programs. You may need the HPPA-only .EXPORT
directive as well.
See section HPPA Assembler Directives.
.hidden names
This one of the ELF visibility directives. The other two are
.internal
(see section .internal
) and
.protected
(see section .protected
).
This directive overrides the named symbols default visibility (which is set by
their binding: local, global or weak). The directive sets the visibility to
hidden
which means that the symbols are not visible to other components.
Such symbols are always considered to be protected
as well.
.hword expressions
This expects zero or more expressions, and emits a 16 bit number for each.
This directive is a synonym for `.short'; depending on the target architecture, it may also be a synonym for `.word'.
.ident
This directive is used by some assemblers to place tags in object files.
as
simply accepts the directive for source-file
compatibility with such assemblers, but does not actually emit anything
for it.
.if absolute expression
.if
marks the beginning of a section of code which is only
considered part of the source program being assembled if the argument
(which must be an absolute expression) is non-zero. The end of
the conditional section of code must be marked by .endif
(see section .endif
); optionally, you may include code for the
alternative condition, flagged by .else
(see section .else
).
If you have several conditions to check, .elseif
may be used to avoid
nesting blocks if/else within each subsequent .else
block.
The following variants of .if
are also supported:
.ifdef symbol
.ifc string1,string2
.ifeq absolute expression
.ifeqs string1,string2
.ifc
. The strings must be quoted using double quotes.
.ifge absolute expression
.ifgt absolute expression
.ifle absolute expression
.iflt absolute expression
.ifnc string1,string2.
.ifc
, but the sense of the test is reversed: this assembles the
following section of code if the two strings are not the same.
.ifndef symbol
.ifnotdef symbol
.ifne absolute expression
.if
).
.ifnes string1,string2
.ifeqs
, but the sense of the test is reversed: this assembles the
following section of code if the two strings are not the same.
.incbin "file"[,skip[,count]]
The incbin
directive includes file verbatim at the current
location. You can control the search paths used with the `-I' command-line
option (see section Command-Line Options). Quotation marks are required
around file.
The skip argument skips a number of bytes from the start of the
file. The count argument indicates the maximum number of bytes to
read. Note that the data is not aligned in any way, so it is the user's
responsibility to make sure that proper alignment is provided both before and
after the incbin
directive.
.include "file"
This directive provides a way to include supporting files at specified
points in your source program. The code from file is assembled as
if it followed the point of the .include
; when the end of the
included file is reached, assembly of the original file continues. You
can control the search paths used with the `-I' command-line option
(see section Command-Line Options). Quotation marks are required
around file.
.int expressions
Expect zero or more expressions, of any section, separated by commas. For each expression, emit a number that, at run time, is the value of that expression. The byte order and bit size of the number depends on what kind of target the assembly is for.
.internal names
This one of the ELF visibility directives. The other two are
.hidden
(see section .hidden
) and
.protected
(see section .protected
).
This directive overrides the named symbols default visibility (which is set by
their binding: local, global or weak). The directive sets the visibility to
internal
which means that the symbols are considered to be hidden
(i.e., not visible to other components), and that some extra, processor specific
processing must also be performed upon the symbols as well.
.irp symbol,values
...
Evaluate a sequence of statements assigning different values to symbol.
The sequence of statements starts at the .irp
directive, and is
terminated by an .endr
directive. For each value, symbol is
set to value, and the sequence of statements is assembled. If no
value is listed, the sequence of statements is assembled once, with
symbol set to the null string. To refer to symbol within the
sequence of statements, use \symbol.
For example, assembling
.irp param,1,2,3 move d\param,sp@- .endr |
is equivalent to assembling
move d1,sp@- move d2,sp@- move d3,sp@- |
.irpc symbol,values
...
Evaluate a sequence of statements assigning different values to symbol.
The sequence of statements starts at the .irpc
directive, and is
terminated by an .endr
directive. For each character in value,
symbol is set to the character, and the sequence of statements is
assembled. If no value is listed, the sequence of statements is
assembled once, with symbol set to the null string. To refer to
symbol within the sequence of statements, use \symbol.
For example, assembling
.irpc param,123 move d\param,sp@- .endr |
is equivalent to assembling
move d1,sp@- move d2,sp@- move d3,sp@- |
.lcomm symbol , length
Reserve length (an absolute expression) bytes for a local common
denoted by symbol. The section and value of symbol are
those of the new local common. The addresses are allocated in the bss
section, so that at run-time the bytes start off zeroed. Symbol
is not declared global (see section .global
), so is normally
not visible to ld
.
Some targets permit a third argument to be used with .lcomm
. This
argument specifies the desired alignment of the symbol in the bss section.
The syntax for .lcomm
differs slightly on the HPPA. The syntax is
`symbol .lcomm, length'; symbol is optional.
.lflags
as
accepts this directive, for compatibility with other
assemblers, but ignores it.
.line line-number
Change the logical line number. line-number must be an absolute
expression. The next line has that logical line number. Therefore any other
statements on the current line (after a statement separator character) are
reported as on logical line number line-number - 1. One day
as
will no longer support this directive: it is recognized only
for compatibility with existing assembler programs.
Warning: In the AMD29K configuration of as, this command is
not available; use the synonym .ln
in that context.
Even though this is a directive associated with the a.out
or
b.out
object-code formats, as
still recognizes it
when producing COFF output, and treats `.line' as though it
were the COFF `.ln' if it is found outside a
.def
/.endef
pair.
Inside a .def
, `.line' is, instead, one of the directives
used by compilers to generate auxiliary symbol information for
debugging.
.linkonce [type]
.linkonce
pseudo-op must be used for each instance of the section.
Duplicate sections are detected based on the section name, so it should be
unique.
This directive is only supported by a few object file formats; as of this writing, the only object file format which supports it is the Portable Executable format used on Windows NT.
The type argument is optional. If specified, it must be one of the following strings. For example:
.linkonce same_size |
discard
one_only
same_size
same_contents
.ln line-number
`.ln' is a synonym for `.line'.
.mri val
If val is non-zero, this tells as
to enter MRI mode. If
val is zero, this tells as
to exit MRI mode. This change
affects code assembled until the next .mri
directive, or until the end
of the file. See section MRI mode.
.list
Control (in conjunction with the .nolist
directive) whether or
not assembly listings are generated. These two directives maintain an
internal counter (which is zero initially). .list
increments the
counter, and .nolist
decrements it. Assembly listings are
generated whenever the counter is greater than zero.
By default, listings are disabled. When you enable them (with the `-a' command line option; see section Command-Line Options), the initial value of the listing counter is one.
.long expressions
.long
is the same as `.int', see section .int
.
.macro
The commands .macro
and .endm
allow you to define macros that
generate assembly output. For example, this definition specifies a macro
sum
that puts a sequence of numbers into memory:
.macro sum from=0, to=5 .long \from .if \to-\from sum "(\from+1)",\to .endif .endm |
With that definition, `SUM 0,5' is equivalent to this assembly input:
.long 0 .long 1 .long 2 .long 3 .long 4 .long 5 |
.macro macname
.macro macname macargs ...
.macro
statements:
.macro comm
comm
, which takes no
arguments.
.macro plus1 p, p1
.macro plus1 p p1
plus1
,
which takes two arguments; within the macro definition, write
`\p' or `\p1' to evaluate the arguments.
.macro reserve_str p1=0 p2
reserve_str
, with two
arguments. The first argument has a default value, but not the second.
After the definition is complete, you can call the macro either as
`reserve_str a,b' (with `\p1' evaluating to
a and `\p2' evaluating to b), or as `reserve_str
,b' (with `\p1' evaluating as the default, in this case
`0', and `\p2' evaluating to b).
When you call a macro, you can specify the argument values either by position, or by keyword. For example, `sum 9,17' is equivalent to `sum to=17, from=9'.
.endm
.exitm
\@
as
maintains a counter of how many macros it has
executed in this pseudo-variable; you can copy that number to your
output with `\@', but only within a macro definition.
.nolist
Control (in conjunction with the .list
directive) whether or
not assembly listings are generated. These two directives maintain an
internal counter (which is zero initially). .list
increments the
counter, and .nolist
decrements it. Assembly listings are
generated whenever the counter is greater than zero.
.octa bignums
This directive expects zero or more bignums, separated by commas. For each bignum, it emits a 16-byte integer.
The term "octa" comes from contexts in which a "word" is two bytes; hence octa-word for 16 bytes.
.org new-lc , fill
Advance the location counter of the current section to
new-lc. new-lc is either an absolute expression or an
expression with the same section as the current subsection. That is,
you can't use .org
to cross sections: if new-lc has the
wrong section, the .org
directive is ignored. To be compatible
with former assemblers, if the section of new-lc is absolute,
as
issues a warning, then pretends the section of new-lc
is the same as the current subsection.
.org
may only increase the location counter, or leave it
unchanged; you cannot use .org
to move the location counter
backwards.
Because as
tries to assemble programs in one pass, new-lc
may not be undefined. If you really detest this restriction we eagerly await
a chance to share your improved assembler.
Beware that the origin is relative to the start of the section, not to the start of the subsection. This is compatible with other people's assemblers.
When the location counter (of the current subsection) is advanced, the intervening bytes are filled with fill which should be an absolute expression. If the comma and fill are omitted, fill defaults to zero.
.p2align[wl] abs-expr, abs-expr, abs-expr
Pad the location counter (in the current subsection) to a particular storage boundary. The first expression (which must be absolute) is the number of low-order zero bits the location counter must have after advancement. For example `.p2align 3' advances the location counter until it a multiple of 8. If the location counter is already a multiple of 8, no change is needed.
The second expression (also absolute) gives the fill value to be stored in the padding bytes. It (and the comma) may be omitted. If it is omitted, the padding bytes are normally zero. However, on some systems, if the section is marked as containing code and the fill value is omitted, the space is filled with no-op instructions.
The third expression is also absolute, and is also optional. If it is present, it is the maximum number of bytes that should be skipped by this alignment directive. If doing the alignment would require skipping more bytes than the specified maximum, then the alignment is not done at all. You can omit the fill value (the second argument) entirely by simply using two commas after the required alignment; this can be useful if you want the alignment to be filled with no-op instructions when appropriate.
The .p2alignw
and .p2alignl
directives are variants of the
.p2align
directive. The .p2alignw
directive treats the fill
pattern as a two byte word value. The .p2alignl
directives treats the
fill pattern as a four byte longword value. For example, .p2alignw
2,0x368d
will align to a multiple of 4. If it skips two bytes, they will be
filled in with the value 0x368d (the exact placement of the bytes depends upon
the endianness of the processor). If it skips 1 or 3 bytes, the fill value is
undefined.
.previous
This is one of the ELF section stack manipulation directives. The others are
.section
(see section 7.76 .section name
), .subsection
(see section 7.87 .subsection name
),
.pushsection
(see section 7.71 .pushsection name , subsection
), and .popsection
(see section 7.66 .popsection
).
This directive swaps the current section (and subsection) with most recently
referenced section (and subsection) prior to this one. Multiple
.previous
directives in a row will flip between two sections (and their
subsections).
In terms of the section stack, this directive swaps the current section with the top section on the section stack.
.popsection
This is one of the ELF section stack manipulation directives. The others are
.section
(see section 7.76 .section name
), .subsection
(see section 7.87 .subsection name
),
.pushsection
(see section 7.71 .pushsection name , subsection
), and .previous
(see section 7.65 .previous
).
This directive replaces the current section (and subsection) with the top section (and subsection) on the section stack. This section is popped off the stack.
.print string
as
will print string on the standard output during
assembly. You must put string in double quotes.
.protected names
This one of the ELF visibility directives. The other two are
.hidden
(see section 7.42 .hidden names
) and .internal
(see section 7.49 .internal names
).
This directive overrides the named symbols default visibility (which is set by
their binding: local, global or weak). The directive sets the visibility to
protected
which means that any references to the symbols from within the
components that defines them must be resolved to the definition in that
component, even if a definition in another component would normally preempt
this.
.psize lines , columns
Use this directive to declare the number of lines--and, optionally, the number of columns--to use for each page, when generating listings.
If you do not use .psize
, listings use a default line-count
of 60. You may omit the comma and columns specification; the
default width is 200 columns.
as
generates formfeeds whenever the specified number of
lines is exceeded (or whenever you explicitly request one, using
.eject
).
If you specify lines as 0
, no formfeeds are generated save
those explicitly specified with .eject
.
.purgem name
Undefine the macro name, so that later uses of the string will not be
expanded. See section 7.60 .macro
.
.pushsection name , subsection
This is one of the ELF section stack manipulation directives. The others are
.section
(see section 7.76 .section name
), .subsection
(see section 7.87 .subsection name
),
.popsection
(see section 7.66 .popsection
), and .previous
(see section 7.65 .previous
).
This directive is a synonym for .section
. It pushes the current section
(and subsection) onto the top of the section stack, and then replaces the
current section and subsection with name
and subsection
.
.quad bignums
.quad
expects zero or more bignums, separated by commas. For
each bignum, it emits
an 8-byte integer. If the bignum won't fit in 8 bytes, it prints a
warning message; and just takes the lowest order 8 bytes of the bignum.
The term "quad" comes from contexts in which a "word" is two bytes; hence quad-word for 8 bytes.
.rept count
Repeat the sequence of lines between the .rept
directive and the next
.endr
directive count times.
For example, assembling
.rept 3 .long 0 .endr |
is equivalent to assembling
.long 0 .long 0 .long 0 |
.sbttl "subheading"
Use subheading as the title (third line, immediately after the title line) when generating assembly listings.
This directive affects subsequent pages, as well as the current page if it appears within ten lines of the top of a page.
.scl class
Set the storage-class value for a symbol. This directive may only be
used inside a .def
/.endef
pair. Storage class may flag
whether a symbol is static or external, or it may record further
symbolic debugging information.
The `.scl' directive is primarily associated with COFF output; when
configured to generate b.out
output format, as
accepts this directive but ignores it.
.section name
Use the .section
directive to assemble the following code into a section
named name.
This directive is only supported for targets that actually support arbitrarily
named sections; on a.out
targets, for example, it is not accepted, even
with a standard a.out
section name.
For COFF targets, the .section
directive is used in one of the following
ways:
.section name[, "flags"] .section name[, subsegment] |
If the optional argument is quoted, it is taken as flags to use for the section. Each flag is a single character. The following flags are recognized:
b
n
w
d
r
x
s
a
If no flags are specified, the default flags depend upon the section name. If
the section name is not recognized, the default will be for the section to be
loaded and writable. Note the n
and w
flags remove attributes
from the section, rather than adding them, so if they are used on their own it
will be as if no flags had been specified at all.
If the optional argument to the .section
directive is not quoted, it is
taken as a subsegment number (see section 4.4 Sub-Sections).
This is one of the ELF section stack manipulation directives. The others are
.subsection
(see section 7.87 .subsection name
), .pushsection
(see section 7.71 .pushsection name , subsection
), .popsection
(see section 7.66 .popsection
), and
.previous
(see section 7.65 .previous
).
For ELF targets, the .section
directive is used like this:
.section name [, "flags"[, @type[, @entsize]]] |
The optional flags argument is a quoted string which may contain any combination of the following characters:
a
w
x
M
S
The optional type argument may contain one of the following constants:
@progbits
@nobits
Note on targets where the @
character is the start of a comment (eg
ARM) then another character is used instead. For example the ARM port uses the
%
character.
If flags contains M
flag, type argument must be specified
as well as entsize argument. Sections with M
flag but not
S
flag must contain fixed size constants, each entsize octets
long. Sections with both M
and S
must contain zero terminated
strings where each character is entsize bytes long. The linker may remove
duplicates within sections with the same name, same entity size and same flags.
If no flags are specified, the default flags depend upon the section name. If the section name is not recognized, the default will be for the section to have none of the above flags: it will not be allocated in memory, nor writable, nor executable. The section will contain data.
For ELF targets, the assembler supports another type of .section
directive for compatibility with the Solaris assembler:
.section "name"[, flags...] |
Note that the section name is quoted. There may be a sequence of comma separated flags:
#alloc
#write
#execinstr
This directive replaces the current section and subsection. The replaced
section and subsection are pushed onto the section stack. See the contents of
the gas testsuite directory gas/testsuite/gas/elf
for some examples of
how this directive and the other section stack directives work.
.set symbol, expression
Set the value of symbol to expression. This changes symbol's value and type to conform to expression. If symbol was flagged as external, it remains flagged (see section 5.5 Symbol Attributes).
You may .set
a symbol many times in the same assembly.
If you .set
a global symbol, the value stored in the object
file is the last value stored into it.
The syntax for set
on the HPPA is
`symbol .set expression'.
.short expressions
.short
is normally the same as `.word'.
See section .word
.
In some configurations, however, .short
and .word
generate
numbers of different lengths; see section 8. Machine Dependent Features.
.single flonums
This directive assembles zero or more flonums, separated by commas. It
has the same effect as .float
.
The exact kind of floating point numbers emitted depends on how
as
is configured. See section 8. Machine Dependent Features.
.size
This directive is used to set the size associated with a symbol.
For COFF targets, the .size
directive is only permitted inside
.def
/.endef
pairs. It is used like this:
.size expression |
`.size' is only meaningful when generating COFF format output; when
as
is generating b.out
, it accepts this directive but
ignores it.
For ELF targets, the .size
directive is used like this:
.size name , expression |
This directive sets the size associated with a symbol name. The size in bytes is computed from expression which can make use of label arithmetic. This directive is typically used to set the size of function symbols.
.sleb128 expressions
sleb128 stands for "signed little endian base 128." This is a
compact, variable length representation of numbers used by the DWARF
symbolic debugging format. See section .uleb128
.
.skip size , fill
This directive emits size bytes, each of value fill. Both size and fill are absolute expressions. If the comma and fill are omitted, fill is assumed to be zero. This is the same as `.space'.
.space size , fill
This directive emits size bytes, each of value fill. Both size and fill are absolute expressions. If the comma and fill are omitted, fill is assumed to be zero. This is the same as `.skip'.
Warning:.space
has a completely different meaning for HPPA targets; use.block
as a substitute. See HP9000 Series 800 Assembly Language Reference Manual (HP 92432-90001) for the meaning of the.space
directive. See section HPPA Assembler Directives, for a summary.
On the AMD 29K, this directive is ignored; it is accepted for compatibility with other AMD 29K assemblers.
Warning: In most versions of the GNU assembler, the directive.space
has the effect of.block
See section 8. Machine Dependent Features.
.stabd, .stabn, .stabs
There are three directives that begin `.stab'.
All emit symbols (see section 5. Symbols), for use by symbolic debuggers.
The symbols are not entered in the as
hash table: they
cannot be referenced elsewhere in the source file.
Up to five fields are required:
ld
and debuggers choke on silly bit patterns.
If a warning is detected while reading a .stabd
, .stabn
,
or .stabs
statement, the symbol has probably already been created;
you get a half-formed symbol in your object file. This is
compatible with earlier assemblers!
.stabd type , other , desc
The "name" of the symbol generated is not even an empty string. It is a null pointer, for compatibility. Older assemblers used a null pointer so they didn't waste space in object files with empty strings.
The symbol's value is set to the location counter,
relocatably. When your program is linked, the value of this symbol
is the address of the location counter when the .stabd
was
assembled.
.stabn type , other , desc , value
""
.
.stabs string , type , other , desc , value
.string
"str" Copy the characters in str to the object file. You may specify more than one string to copy, separated by commas. Unless otherwise specified for a particular machine, the assembler marks the end of each string with a 0 byte. You can use any of the escape sequences described in Strings.
.struct expression
Switch to the absolute section, and set the section offset to expression, which must be an absolute expression. You might use this as follows:
.struct 0 field1: .struct field1 + 4 field2: .struct field2 + 4 field3: |
field1
to have the value 0, the symbol
field2
to have the value 4, and the symbol field3
to have the
value 8. Assembly would be left in the absolute section, and you would need to
use a .section
directive of some sort to change to some other section
before further assembly.
.subsection name
This is one of the ELF section stack manipulation directives. The others are
.section
(see section 7.76 .section name
), .pushsection
(see section 7.71 .pushsection name , subsection
),
.popsection
(see section 7.66 .popsection
), and .previous
(see section 7.65 .previous
).
This directive replaces the current subsection with name
. The current
section is not changed. The replaced subsection is put onto the section stack
in place of the then current top of stack subsection.
.symver
.symver
directive to bind symbols to specific version nodes
within a source file. This is only supported on ELF platforms, and is
typically used when assembling files to be linked into a shared library.
There are cases where it may make sense to use this in objects to be bound
into an application itself so as to override a versioned symbol from a
shared library.
For ELF targets, the .symver
directive can be used like this:
.symver name, name2@nodename |
.symver
directive effectively creates a symbol
alias with the name name2@nodename, and in fact the main reason that we
just don't try and create a regular alias is that the @ character isn't
permitted in symbol names. The name2 part of the name is the actual name
of the symbol by which it will be externally referenced. The name name
itself is merely a name of convenience that is used so that it is possible to
have definitions for multiple versions of a function within a single source
file, and so that the compiler can unambiguously know which version of a
function is being mentioned. The nodename portion of the alias should be
the name of a node specified in the version script supplied to the linker when
building a shared library. If you are attempting to override a versioned
symbol from a shared library, then nodename should correspond to the
nodename of the symbol you are trying to override.
If the symbol name is not defined within the file being assembled, all references to name will be changed to name2@nodename. If no reference to name is made, name2@nodename will be removed from the symbol table.
Another usage of the .symver
directive is:
.symver name, name2@@nodename |
The third usage of the .symver
directive is:
.symver name, name2@@@nodename |
.tag structname
This directive is generated by compilers to include auxiliary debugging
information in the symbol table. It is only permitted inside
.def
/.endef
pairs. Tags are used to link structure
definitions in the symbol table with instances of those structures.
`.tag' is only used when generating COFF format output; when
as
is generating b.out
, it accepts this directive but
ignores it.
.text subsection
Tells as
to assemble the following statements onto the end of
the text subsection numbered subsection, which is an absolute
expression. If subsection is omitted, subsection number zero
is used.
.title "heading"
Use heading as the title (second line, immediately after the source file name and pagenumber) when generating assembly listings.
This directive affects subsequent pages, as well as the current page if it appears within ten lines of the top of a page.
.type
This directive is used to set the type of a symbol.
For COFF targets, this directive is permitted only within
.def
/.endef
pairs. It is used like this:
.type int |
This records the integer int as the type attribute of a symbol table entry.
`.type' is associated only with COFF format output; when
as
is configured for b.out
output, it accepts this
directive but ignores it.
For ELF targets, the .type
directive is used like this:
.type name , type description |
This sets the type of symbol name to be either a function symbol or an object symbol. There are five different syntaxes supported for the type description field, in order to provide compatibility with various other assemblers. The syntaxes supported are:
.type <name>,#function .type <name>,#object .type <name>,@function .type <name>,@object .type <name>,%function .type <name>,%object .type <name>,"function" .type <name>,"object" .type <name> STT_FUNCTION .type <name> STT_OBJECT |
.uleb128 expressions
uleb128 stands for "unsigned little endian base 128." This is a
compact, variable length representation of numbers used by the DWARF
symbolic debugging format. See section .sleb128
.
.val addr
This directive, permitted only within .def
/.endef
pairs,
records the address addr as the value attribute of a symbol table
entry.
`.val' is used only for COFF output; when as
is
configured for b.out
, it accepts this directive but ignores it.
.version "string"
This directive creates a .note
section and places into it an ELF
formatted note of type NT_VERSION. The note's name is set to string
.
.vtable_entry table, offset
This directive finds or creates a symbol table
and creates a
VTABLE_ENTRY
relocation for it with an addend of offset
.
.vtable_inherit child, parent
This directive finds the symbol child
and finds or creates the symbol
parent
and then creates a VTABLE_INHERIT
relocation for the
parent whose addend is the value of the child symbol. As a special case the
parent name of 0
is treated as refering the *ABS*
section.
.weak names
This directive sets the weak attribute on the comma separated list of symbol
names
. If the symbols do not already exist, they will be created.
.word expressions
This directive expects zero or more expressions, of any section, separated by commas.
The size of the number emitted, and its byte order, depend on what target computer the assembly is for.
Warning: Special Treatment to support Compilers
Machines with a 32-bit address space, but that do less than 32-bit addressing, require the following special treatment. If the machine of interest to you does 32-bit addressing (or doesn't require it; see section 8. Machine Dependent Features), you can ignore this issue.
In order to assemble compiler output into something that works,
as
occasionally does strange things to `.word' directives.
Directives of the form `.word sym1-sym2' are often emitted by
compilers as part of jump tables. Therefore, when as
assembles a
directive of the form `.word sym1-sym2', and the difference between
sym1
and sym2
does not fit in 16 bits, as
creates a secondary jump table, immediately before the next label.
This secondary jump table is preceded by a short-jump to the
first byte after the secondary table. This short-jump prevents the flow
of control from accidentally falling into the new table. Inside the
table is a long-jump to sym2
. The original `.word'
contains sym1
minus the address of the long-jump to
sym2
.
If there were several occurrences of `.word sym1-sym2' before the
secondary jump table, all of them are adjusted. If there was a
`.word sym3-sym4', that also did not fit in sixteen bits, a
long-jump to sym4
is included in the secondary jump table,
and the .word
directives are adjusted to contain sym3
minus the address of the long-jump to sym4
; and so on, for as many
entries in the original jump table as necessary.
One day these directives won't work. They are included for compatibility with older assemblers.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |