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: Ld Sections, Next: As Sections, Prev: Secs Background, Up: Sections Linker Sections =============== `ld' deals with just four kinds of sections, summarized below. *named sections* *text section* *data section* These sections hold your program. `as' and `ld' treat them as separate but equal sections. Anything you can say of one section is true another. When the program is running, however, it is customary for the text section to be unalterable. The text section is often shared among processes: it contains instructions, constants and the like. The data section of a running program is usually alterable: for example, C variables would be stored in the data section. *bss section* This section contains zeroed bytes when your program begins running. It is used to hold unitialized variables or common storage. The length of each partial program's bss section is important, but because it starts out containing zeroed bytes there is no need to store explicit zero bytes in the object file. The bss section was invented to eliminate those explicit zeros from object files. *absolute section* Address 0 of this section is always "relocated" to runtime address 0. This is useful if you want to refer to an address that `ld' must not change when relocating. In this sense we speak of absolute addresses being "unrelocatable": they do not change during relocation. *undefined section* This "section" is a catch-all for address references to objects not in the preceding sections. An idealized example of three relocatable sections follows. The example uses the traditional section names `.text' and `.data'. Memory addresses are on the horizontal axis. +-----+----+--+ partial program # 1: |ttttt|dddd|00| +-----+----+--+ text data bss seg. seg. seg. +---+---+---+ partial program # 2: |TTT|DDD|000| +---+---+---+ +--+---+-----+--+----+---+-----+~~ linked program: | |TTT|ttttt| |dddd|DDD|00000| +--+---+-----+--+----+---+-----+~~ addresses: 0 ...  File: as.info, Node: As Sections, Next: Sub-Sections, Prev: Ld Sections, Up: Sections Assembler Internal Sections =========================== These sections are meant only for the internal use of `as'. They have no meaning at run-time. You do not really need to know about these sections for most purposes; but they can be mentioned in `as' warning messages, so it might be helpful to have an idea of their meanings to `as'. These sections are used to permit the value of every expression in your assembly language program to be a section-relative address. ASSEMBLER-INTERNAL-LOGIC-ERROR! An internal assembler logic error has been found. This means there is a bug in the assembler. expr section The assembler stores complex expression internally as combinations of symbols. When it needs to represent an expression as a symbol, it puts it in the expr section.  File: as.info, Node: Sub-Sections, Next: bss, Prev: As Sections, Up: Sections Sub-Sections ============ Assembled bytes conventionally fall into two sections: text and data. You may have separate groups of data in named sections that you want to end up near to each other in the object file, even though they are not contiguous in the assembler source. `as' allows you to use "subsections" for this purpose. Within each section, there can be numbered subsections with values from 0 to 8192. Objects assembled into the same subsection go into the object file together with other objects in the same subsection. For example, a compiler might want to store constants in the text section, but might not want to have them interspersed with the program being assembled. In this case, the compiler could issue a `.text 0' before each section of code being output, and a `.text 1' before each group of constants being output. Subsections are optional. If you do not use subsections, everything goes in subsection number zero. Each subsection is zero-padded up to a multiple of four bytes. (Subsections may be padded a different amount on different flavors of `as'.) Subsections appear in your object file in numeric order, lowest numbered to highest. (All this to be compatible with other people's assemblers.) The object file contains no representation of subsections; `ld' and other programs that manipulate object files see no trace of them. They just see all your text subsections as a text section, and all your data subsections as a data section. To specify which subsection you want subsequent statements assembled into, use a numeric argument to specify it, in a `.text EXPRESSION' or a `.data EXPRESSION' statement. When generating COFF output, you can also use an extra subsection argument with arbitrary named sections: `.section NAME, EXPRESSION'. EXPRESSION should be an absolute expression. (*Note Expressions::.) If you just say `.text' then `.text 0' is assumed. Likewise `.data' means `.data 0'. Assembly begins in `text 0'. For instance: .text 0 # The default subsection is text 0 anyway. .ascii "This lives in the first text subsection. *" .text 1 .ascii "But this lives in the second text subsection." .data 0 .ascii "This lives in the data section," .ascii "in the first data subsection." .text 0 .ascii "This lives in the first text section," .ascii "immediately following the asterisk (*)." Each section has a "location counter" incremented by one for every byte assembled into that section. Because subsections are merely a convenience restricted to `as' there is no concept of a subsection location counter. There is no way to directly manipulate a location counter--but the `.align' directive changes it, and any label definition captures its current value. The location counter of the section where statements are being assembled is said to be the "active" location counter.  File: as.info, Node: bss, Prev: Sub-Sections, Up: Sections bss Section =========== The bss section is used for local common variable storage. You may allocate address space in the bss section, but you may not dictate data to load into it before your program executes. When your program starts running, all the contents of the bss section are zeroed bytes. The `.lcomm' pseudo-op defines a symbol in the bss section; see *Note `.lcomm': Lcomm. The `.comm' pseudo-op may be used to declare a common symbol, which is another form of uninitialized symbol; see *Note `.comm': Comm. When assembling for a target which supports multiple sections, such as ELF or COFF, you may switch into the `.bss' section and define symbols as usual; see *Note `.section': Section. You may only assemble zero values into the section. Typically the section will only contain symbol definitions and `.skip' directives (*note `.skip': Skip.).  File: as.info, Node: Symbols, Next: Expressions, Prev: Sections, Up: Top Symbols ******* Symbols are a central concept: the programmer uses symbols to name things, the linker uses symbols to link, and the debugger uses symbols to debug. *Warning:* `as' does not place symbols in the object file in the same order they were declared. This may break some debuggers. * Menu: * Labels:: Labels * Setting Symbols:: Giving Symbols Other Values * Symbol Names:: Symbol Names * Dot:: The Special Dot Symbol * Symbol Attributes:: Symbol Attributes  File: as.info, Node: Labels, Next: Setting Symbols, Up: Symbols Labels ====== A "label" is written as a symbol immediately followed by a colon `:'. The symbol then represents the current value of the active location counter, and is, for example, a suitable instruction operand. You are warned if you use the same symbol to represent two different locations: the first definition overrides any other definitions. On the HPPA, the usual form for a label need not be immediately followed by a colon, but instead must start in column zero. Only one label may be defined on a single line. To work around this, the HPPA version of `as' also provides a special directive `.label' for defining labels more flexibly.  File: as.info, Node: Setting Symbols, Next: Symbol Names, Prev: Labels, Up: Symbols Giving Symbols Other Values =========================== A symbol can be given an arbitrary value by writing a symbol, followed by an equals sign `=', followed by an expression (*note Expressions::.). This is equivalent to using the `.set' directive. *Note `.set': Set.  File: as.info, Node: Symbol Names, Next: Dot, Prev: Setting Symbols, Up: Symbols Symbol Names ============ Symbol names begin with a letter or with one of `._'. On most machines, you can also use `$' in symbol names; exceptions are noted in *Note Machine Dependencies::. That character may be followed by any string of digits, letters, dollar signs (unless otherwise noted in *Note Machine Dependencies::), and underscores. For the AMD 29K family, `?' is also allowed in the body of a symbol name, though not at its beginning. Case of letters is significant: `foo' is a different symbol name than `Foo'. Each symbol has exactly one name. Each name in an assembly language program refers to exactly one symbol. You may use that symbol name any number of times in a program. Local Symbol Names ------------------ Local symbols help compilers and programmers use names temporarily. There are ten local symbol names, which are re-used throughout the program. You may refer to them using the names `0' `1' ... `9'. To define a local symbol, write a label of the form `N:' (where N represents any digit). To refer to the most recent previous definition of that symbol write `Nb', using the same digit as when you defined the label. To refer to the next definition of a local label, write `Nf'--where N gives you a choice of 10 forward references. The `b' stands for "backwards" and the `f' stands for "forwards". Local symbols are not emitted by the current GNU C compiler. There is no restriction on how you can use these labels, but remember that at any point in the assembly you can refer to at most 10 prior local labels and to at most 10 forward local labels. Local symbol names are only a notation device. They are immediately transformed into more conventional symbol names before the assembler uses them. The symbol names stored in the symbol table, appearing in error messages and optionally emitted to the object file have these parts: `L' All local labels begin with `L'. Normally both `as' and `ld' forget symbols that start with `L'. These labels are used for symbols you are never intended to see. If you use the `-L' option then `as' retains these symbols in the object file. If you also instruct `ld' to retain these symbols, you may use them in debugging. `DIGIT' If the label is written `0:' then the digit is `0'. If the label is written `1:' then the digit is `1'. And so on up through `9:'. ``C-A'' This unusual character is included so you do not accidentally invent a symbol of the same name. The character has ASCII value `\001'. `*ordinal number*' This is a serial number to keep the labels distinct. The first `0:' gets the number `1'; The 15th `0:' gets the number `15'; *etc.*. Likewise for the other labels `1:' through `9:'. For instance, the first `1:' is named `L1`C-A'1', the 44th `3:' is named `L3`C-A'44'.  File: as.info, Node: Dot, Next: Symbol Attributes, Prev: Symbol Names, Up: Symbols The Special Dot Symbol ====================== The special symbol `.' refers to the current address that `as' is assembling into. Thus, the expression `melvin: .long .' defines `melvin' to contain its own address. Assigning a value to `.' is treated the same as a `.org' directive. Thus, the expression `.=.+4' is the same as saying `.space 4'.  File: as.info, Node: Symbol Attributes, Prev: Dot, Up: Symbols Symbol Attributes ================= Every symbol has, as well as its name, the attributes "Value" and "Type". Depending on output format, symbols can also have auxiliary attributes. If you use a symbol without defining it, `as' assumes zero for all these attributes, and probably won't warn you. This makes the symbol an externally defined symbol, which is generally what you would want. * Menu: * Symbol Value:: Value * Symbol Type:: Type * a.out Symbols:: Symbol Attributes: `a.out' * COFF Symbols:: Symbol Attributes for COFF * SOM Symbols:: Symbol Attributes for SOM  File: as.info, Node: Symbol Value, Next: Symbol Type, Up: Symbol Attributes Value ----- The value of a symbol is (usually) 32 bits. For a symbol which labels a location in the text, data, bss or absolute sections the value is the number of addresses from the start of that section to the label. Naturally for text, data and bss sections the value of a symbol changes as `ld' changes section base addresses during linking. Absolute symbols' values do not change during linking: that is why they are called absolute. The value of an undefined symbol is treated in a special way. If it is 0 then the symbol is not defined in this assembler source file, and `ld' tries to determine its value from other files linked into the same program. You make this kind of symbol simply by mentioning a symbol name without defining it. A non-zero value represents a `.comm' common declaration. The value is how much common storage to reserve, in bytes (addresses). The symbol refers to the first address of the allocated storage.  File: as.info, Node: Symbol Type, Next: a.out Symbols, Prev: Symbol Value, Up: Symbol Attributes Type ---- The type attribute of a symbol contains relocation (section) information, any flag settings indicating that a symbol is external, and (optionally), other information for linkers and debuggers. The exact format depends on the object-code output format in use.  File: as.info, Node: a.out Symbols, Next: COFF Symbols, Prev: Symbol Type, Up: Symbol Attributes Symbol Attributes: `a.out' -------------------------- * Menu: * Symbol Desc:: Descriptor * Symbol Other:: Other  File: as.info, Node: Symbol Desc, Next: Symbol Other, Up: a.out Symbols Descriptor .......... This is an arbitrary 16-bit value. You may establish a symbol's descriptor value by using a `.desc' statement (*note `.desc': Desc.). A descriptor value means nothing to `as'.  File: as.info, Node: Symbol Other, Prev: Symbol Desc, Up: a.out Symbols Other ..... This is an arbitrary 8-bit value. It means nothing to `as'.  File: as.info, Node: COFF Symbols, Next: SOM Symbols, Prev: a.out Symbols, Up: Symbol Attributes Symbol Attributes for COFF -------------------------- The COFF format supports a multitude of auxiliary symbol attributes; like the primary symbol attributes, they are set between `.def' and `.endef' directives. Primary Attributes .................. The symbol name is set with `.def'; the value and type, respectively, with `.val' and `.type'. Auxiliary Attributes .................... The `as' directives `.dim', `.line', `.scl', `.size', and `.tag' can generate auxiliary symbol table information for COFF.  File: as.info, Node: SOM Symbols, Prev: COFF Symbols, Up: Symbol Attributes Symbol Attributes for SOM ------------------------- The SOM format for the HPPA supports a multitude of symbol attributes set with the `.EXPORT' and `.IMPORT' directives. The attributes are described in `HP9000 Series 800 Assembly Language Reference Manual' (HP 92432-90001) under the `IMPORT' and `EXPORT' assembler directive documentation.  File: as.info, Node: Expressions, Next: Pseudo Ops, Prev: Symbols, Up: Top Expressions *********** An "expression" specifies an address or numeric value. Whitespace may precede and/or follow an expression. The result of an expression must be an absolute number, or else an offset into a particular section. If an expression is not absolute, and there is not enough information when `as' sees the expression to know its section, a second pass over the source program might be necessary to interpret the expression--but the second pass is currently not implemented. `as' aborts with an error message in this situation. * Menu: * Empty Exprs:: Empty Expressions * Integer Exprs:: Integer Expressions  File: as.info, Node: Empty Exprs, Next: Integer Exprs, Up: Expressions Empty Expressions ================= An empty expression has no value: it is just whitespace or null. Wherever an absolute expression is required, you may omit the expression, and `as' assumes a value of (absolute) 0. This is compatible with other assemblers.  File: as.info, Node: Integer Exprs, Prev: Empty Exprs, Up: Expressions Integer Expressions =================== An "integer expression" is one or more *arguments* delimited by *operators*. * Menu: * Arguments:: Arguments * Operators:: Operators * Prefix Ops:: Prefix Operators * Infix Ops:: Infix Operators  File: as.info, Node: Arguments, Next: Operators, Up: Integer Exprs Arguments --------- "Arguments" are symbols, numbers or subexpressions. In other contexts arguments are sometimes called "arithmetic operands". In this manual, to avoid confusing them with the "instruction operands" of the machine language, we use the term "argument" to refer to parts of expressions only, reserving the word "operand" to refer only to machine instruction operands. Symbols are evaluated to yield {SECTION NNN} where SECTION is one of text, data, bss, absolute, or undefined. NNN is a signed, 2's complement 32 bit integer. Numbers are usually integers. A number can be a flonum or bignum. In this case, you are warned that only the low order 32 bits are used, and `as' pretends these 32 bits are an integer. You may write integer-manipulating instructions that act on exotic constants, compatible with other assemblers. Subexpressions are a left parenthesis `(' followed by an integer expression, followed by a right parenthesis `)'; or a prefix operator followed by an argument.  File: as.info, Node: Operators, Next: Prefix Ops, Prev: Arguments, Up: Integer Exprs Operators --------- "Operators" are arithmetic functions, like `+' or `%'. Prefix operators are followed by an argument. Infix operators appear between their arguments. Operators may be preceded and/or followed by whitespace.  File: as.info, Node: Prefix Ops, Next: Infix Ops, Prev: Operators, Up: Integer Exprs Prefix Operator --------------- `as' has the following "prefix operators". They each take one argument, which must be absolute. `-' "Negation". Two's complement negation. `~' "Complementation". Bitwise not.  File: as.info, Node: Infix Ops, Prev: Prefix Ops, Up: Integer Exprs Infix Operators --------------- "Infix operators" take two arguments, one on either side. Operators have precedence, but operations with equal precedence are performed left to right. Apart from `+' or `-', both arguments must be absolute, and the result is absolute. 1. Highest Precedence `*' "Multiplication". `/' "Division". Truncation is the same as the C operator `/' `%' "Remainder". `<' `<<' "Shift Left". Same as the C operator `<<'. `>' `>>' "Shift Right". Same as the C operator `>>'. 2. Intermediate precedence `|' "Bitwise Inclusive Or". `&' "Bitwise And". `^' "Bitwise Exclusive Or". `!' "Bitwise Or Not". 3. Lowest Precedence `+' "Addition". If either argument is absolute, the result has the section of the other argument. You may not add together arguments from different sections. `-' "Subtraction". If the right argument is absolute, the result has the section of the left argument. If both arguments are in the same section, the result is absolute. You may not subtract arguments from different sections. In short, it's only meaningful to add or subtract the *offsets* in an address; you can only have a defined section in one of the two arguments.  File: as.info, Node: Pseudo Ops, Next: Machine Dependencies, Prev: Expressions, Up: Top Assembler Directives ******************** All assembler directives have names that begin with a period (`.'). The rest of the name is letters, usually in lower case. This chapter discusses directives that are available regardless of the target machine configuration for the GNU assembler. Some machine configurations provide additional directives. *Note Machine Dependencies::. * Menu: * Abort:: `.abort' * ABORT:: `.ABORT' * Align:: `.align ABS-EXPR , ABS-EXPR' * App-File:: `.app-file STRING' * Ascii:: `.ascii "STRING"'... * Asciz:: `.asciz "STRING"'... * Balign:: `.balign ABS-EXPR , ABS-EXPR' * Byte:: `.byte EXPRESSIONS' * Comm:: `.comm SYMBOL , LENGTH ' * Data:: `.data SUBSECTION' * Def:: `.def NAME' * Desc:: `.desc SYMBOL, ABS-EXPRESSION' * Dim:: `.dim' * Double:: `.double FLONUMS' * Eject:: `.eject' * Else:: `.else' * Endef:: `.endef' * Endif:: `.endif' * Equ:: `.equ SYMBOL, EXPRESSION' * Equiv:: `.equiv SYMBOL, EXPRESSION' * Err:: `.err' * Extern:: `.extern' * File:: `.file STRING' * Fill:: `.fill REPEAT , SIZE , VALUE' * Float:: `.float FLONUMS' * Global:: `.global SYMBOL', `.globl SYMBOL' * hword:: `.hword EXPRESSIONS' * Ident:: `.ident' * If:: `.if ABSOLUTE EXPRESSION' * Include:: `.include "FILE"' * Int:: `.int EXPRESSIONS' * Irp:: `.irp SYMBOL,VALUES'... * Irpc:: `.irpc SYMBOL,VALUES'... * Lcomm:: `.lcomm SYMBOL , LENGTH' * Lflags:: `.lflags' * Line:: `.line LINE-NUMBER' * Ln:: `.ln LINE-NUMBER' * Linkonce:: `.linkonce [TYPE]' * List:: `.list' * Long:: `.long EXPRESSIONS' * Macro:: `.macro NAME ARGS'... * MRI:: `.mri VAL' * Nolist:: `.nolist' * Octa:: `.octa BIGNUMS' * Org:: `.org NEW-LC , FILL' * P2align:: `.p2align ABS-EXPR , ABS-EXPR' * Psize:: `.psize LINES, COLUMNS' * Quad:: `.quad BIGNUMS' * Rept:: `.rept COUNT' * Sbttl:: `.sbttl "SUBHEADING"' * Scl:: `.scl CLASS' * Section:: `.section NAME, SUBSECTION' * Set:: `.set SYMBOL, EXPRESSION' * Short:: `.short EXPRESSIONS' * Single:: `.single FLONUMS' * Size:: `.size' * Skip:: `.skip SIZE , FILL' * Space:: `.space SIZE , FILL' * Stab:: `.stabd, .stabn, .stabs' * String:: `.string "STR"' * Symver:: `.symver NAME,NAME2@NODENAME' * Tag:: `.tag STRUCTNAME' * Text:: `.text SUBSECTION' * Title:: `.title "HEADING"' * Type:: `.type INT' * Val:: `.val ADDR' * Word:: `.word EXPRESSIONS' * Deprecated:: Deprecated Directives  File: as.info, Node: Abort, Next: ABORT, Up: Pseudo Ops `.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.  File: as.info, Node: ABORT, Next: Align, Prev: Abort, Up: Pseudo Ops `.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.  File: as.info, Node: Align, Next: App-File, Prev: ABORT, Up: Pseudo Ops `.align ABS-EXPR, ABS-EXPR, ABS-EXPR' ===================================== Pad the location counter (in the current subsection) to a particular storage boundary. The first expression (which must be absolute) is the alignment required, as described below. The second expression (also absolute) gives the fill value to be stored in the padding bytes. It (and the comma) may be omitted. If it is omitted, the padding bytes are normally zero. However, on some systems, if the section is marked as containing code and the fill value is omitted, the space is filled with no-op instructions. The third expression is also absolute, and is also optional. If it is present, it is the maximum number of bytes that should be skipped by this alignment directive. If doing the alignment would require skipping more bytes than the specified maximum, then the alignment is not done at all. You can omit the fill value (the second argument) entirely by simply using two commas after the required alignment; this can be useful if you want the alignment to be filled with no-op instructions when appropriate. The way the required alignment is specified varies from system to system. For the a29k, hppa, m68k, m88k, w65, sparc, and Hitachi SH, and i386 using ELF format, the first expression is the alignment request in bytes. For example `.align 8' advances the location counter until it is a multiple of 8. If the location counter is already a multiple of 8, no change is needed. For other systems, including the i386 using a.out format, it is the number of low-order zero bits the location counter must have after advancement. For example `.align 3' advances the location counter until it a multiple of 8. If the location counter is already a multiple of 8, no change is needed. This inconsistency is due to the different behaviors of the various native assemblers for these systems which GAS must emulate. GAS also provides `.balign' and `.p2align' directives, described later, which have a consistent behavior across all architectures (but are specific to GAS).  File: as.info, Node: App-File, Next: Ascii, Prev: Align, Up: Pseudo Ops `.app-file STRING' ================== `.app-file' (which may also be spelled `.file') tells `as' that we are about to start a new logical file. STRING is the new file name. In general, the filename is recognized whether or not it is surrounded by quotes `"'; but if you wish to specify an empty file name is permitted, you must give the quotes-`""'. This statement may go away in future: it is only recognized to be compatible with old `as' programs.  File: as.info, Node: Ascii, Next: Asciz, Prev: App-File, Up: Pseudo Ops `.ascii "STRING"'... ==================== `.ascii' expects zero or more string literals (*note Strings::.) separated by commas. It assembles each string (with no automatic trailing zero byte) into consecutive addresses.  File: as.info, Node: Asciz, Next: Balign, Prev: Ascii, Up: Pseudo Ops `.asciz "STRING"'... ==================== `.asciz' is just like `.ascii', but each string is followed by a zero byte. The "z" in `.asciz' stands for "zero".  File: as.info, Node: Balign, Next: Byte, Prev: Asciz, Up: Pseudo Ops `.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.  File: as.info, Node: Byte, Next: Comm, Prev: Balign, Up: Pseudo Ops `.byte EXPRESSIONS' =================== `.byte' expects zero or more expressions, separated by commas. Each expression is assembled into the next byte.  File: as.info, Node: Comm, Next: Data, Prev: Byte, Up: Pseudo Ops `.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.  File: as.info, Node: Data, Next: Def, Prev: Comm, Up: Pseudo Ops `.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.  File: as.info, Node: Def, Next: Desc, Prev: Data, Up: Pseudo Ops `.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.  File: as.info, Node: Desc, Next: Dim, Prev: Def, Up: Pseudo Ops `.desc SYMBOL, ABS-EXPRESSION' ============================== This directive sets the descriptor of the symbol (*note 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.  File: as.info, Node: Dim, Next: Double, Prev: Desc, Up: Pseudo Ops `.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.  File: as.info, Node: Double, Next: Eject, Prev: Dim, Up: Pseudo Ops `.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. *Note Machine Dependencies::.  File: as.info, Node: Eject, Next: Else, Prev: Double, Up: Pseudo Ops `.eject' ======== Force a page break at this point, when generating assembly listings.  File: as.info, Node: Else, Next: Endef, Prev: Eject, Up: Pseudo Ops `.else' ======= `.else' is part of the `as' support for conditional assembly; *note `.if': If.. It marks the beginning of a section of code to be assembled if the condition for the preceding `.if' was false.  File: as.info, Node: Endef, Next: Endif, Prev: Else, Up: Pseudo Ops `.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.  File: as.info, Node: Endif, Next: Equ, Prev: Endef, Up: Pseudo Ops `.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. *Note `.if': If.  File: as.info, Node: Equ, Next: Equiv, Prev: Endif, Up: Pseudo Ops `.equ SYMBOL, EXPRESSION' ========================= This directive sets the value of SYMBOL to EXPRESSION. It is synonymous with `.set'; *note `.set': Set.. The syntax for `equ' on the HPPA is `SYMBOL .equ EXPRESSION'.  File: as.info, Node: Equiv, Next: Err, Prev: Equ, Up: Pseudo Ops `.equiv SYMBOL, EXPRESSION' =========================== The `.equiv' directive is like `.equ' and `.set', except that the assembler will signal an error if SYMBOL is already defined. Except for the contents of the error message, this is roughly equivalent to .ifdef SYM .err .endif .equ SYM,VAL  File: as.info, Node: Err, Next: Extern, Prev: Equiv, Up: Pseudo Ops `.err' ====== If `as' assembles a `.err' directive, it will print an error message and, unless the `-Z' option was used, it will not generate an object file. This can be used to signal error an conditionally compiled code.  File: as.info, Node: Extern, Next: File, Prev: Err, Up: Pseudo Ops `.extern' ========= `.extern' is accepted in the source program--for compatibility with other assemblers--but it is ignored. `as' treats all undefined symbols as external.  File: as.info, Node: File, Next: Fill, Prev: Extern, Up: Pseudo Ops `.file STRING' ============== `.file' (which may also be spelled `.app-file') tells `as' that we are about to start a new logical file. STRING is the new file name. In general, the filename is recognized whether or not it is surrounded by quotes `"'; but if you wish to specify an empty file name, you must give the quotes-`""'. This statement may go away in future: it is only recognized to be compatible with old `as' programs. In some configurations of `as', `.file' has already been removed to avoid conflicts with other assemblers. *Note Machine Dependencies::.  File: as.info, Node: Fill, Next: Float, Prev: File, Up: Pseudo Ops `.fill REPEAT , SIZE , VALUE' ============================= RESULT, SIZE and VALUE are absolute expressions. This emits REPEAT copies of SIZE bytes. REPEAT may be zero or more. SIZE may be zero or more, but if it is more than 8, then it is deemed to have the value 8, compatible with other people's assemblers. The contents of each REPEAT bytes is taken from an 8-byte number. The highest order 4 bytes are zero. The lowest order 4 bytes are VALUE rendered in the byte-order of an integer on the computer `as' is assembling for. Each SIZE bytes in a repetition is taken from the lowest order SIZE bytes of this number. Again, this bizarre behavior is compatible with other people's assemblers. SIZE and VALUE are optional. If the second comma and VALUE are absent, VALUE is assumed zero. If the first comma and following tokens are absent, SIZE is assumed to be 1.  File: as.info, Node: Float, Next: Global, Prev: Fill, Up: Pseudo Ops `.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. *Note Machine Dependencies::.  File: as.info, Node: Global, Next: hword, Prev: Float, Up: Pseudo Ops `.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. *Note HPPA Assembler Directives: HPPA Directives.  File: as.info, Node: hword, Next: Ident, Prev: Global, Up: Pseudo Ops `.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'.  File: as.info, Node: Ident, Next: If, Prev: hword, Up: Pseudo Ops `.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.  File: as.info, Node: If, Next: Include, Prev: Ident, Up: Pseudo Ops `.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' (*note `.endif': Endif.); optionally, you may include code for the alternative condition, flagged by `.else' (*note `.else': Else.). The following variants of `.if' are also supported: `.ifdef SYMBOL' Assembles the following section of code if the specified SYMBOL has been defined. `.ifndef SYMBOL' `.ifnotdef SYMBOL' Assembles the following section of code if the specified SYMBOL has not been defined. Both spelling variants are equivalent.  File: as.info, Node: Include, Next: Int, Prev: If, Up: Pseudo Ops `.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 (*note Command-Line Options: Invoking.). Quotation marks are required around FILE.  File: as.info, Node: Int, Next: Irp, Prev: Include, Up: Pseudo Ops `.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.  File: as.info, Node: Irp, Next: Irpc, Prev: Int, Up: Pseudo Ops `.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@-  File: as.info, Node: Irpc, Next: Lcomm, Prev: Irp, Up: Pseudo Ops `.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@-  File: as.info, Node: Lcomm, Next: Lflags, Prev: Irpc, Up: Pseudo Ops `.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 (*note `.global': 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.  File: as.info, Node: Lflags, Next: Line, Prev: Lcomm, Up: Pseudo Ops `.lflags' ========= `as' accepts this directive, for compatibility with other assemblers, but ignores it.  File: as.info, Node: Line, Next: Ln, Prev: Lflags, Up: Pseudo Ops `.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.  File: as.info, Node: Linkonce, Next: List, Prev: Ln, Up: Pseudo Ops `.linkonce [TYPE]' ================== Mark the current section so that the linker only includes a single copy of it. This may be used to include the same section in several different object files, but ensure that the linker will only include it once in the final output file. The `.linkonce' pseudo-op must be used for each instance of the section. Duplicate sections are detected based on the section name, so it should be unique. This directive is only supported by a few object file formats; as of this writing, the only object file format which supports it is the Portable Executable format used on Windows NT. The TYPE argument is optional. If specified, it must be one of the following strings. For example: .linkonce same_size Not all types may be supported on all object file formats. `discard' Silently discard duplicate sections. This is the default. `one_only' Warn if there are duplicate sections, but still keep only one copy. `same_size' Warn if any of the duplicates have different sizes. `same_contents' Warn if any of the duplicates do not have exactly the same contents.  File: as.info, Node: Ln, Next: Linkonce, Prev: Line, Up: Pseudo Ops `.ln LINE-NUMBER' ================= `.ln' is a synonym for `.line'.  File: as.info, Node: MRI, Next: Nolist, Prev: Macro, Up: Pseudo Ops `.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. *Note MRI mode: M.  File: as.info, Node: List, Next: Long, Prev: Linkonce, Up: Pseudo Ops `.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; *note Command-Line Options: Invoking.), the initial value of the listing counter is one.  File: as.info, Node: Long, Next: Macro, Prev: List, Up: Pseudo Ops `.long EXPRESSIONS' =================== `.long' is the same as `.int', *note `.int': Int..  File: as.info, Node: Macro, Next: MRI, Prev: Long, Up: Pseudo Ops `.macro' ======== The commands `.macro' and `.endm' allow you to define macros that generate assembly output. For example, this definition specifies a macro `sum' that puts a sequence of numbers into memory: .macro sum from=0, to=5 .long \from .if \to-\from sum "(\from+1)",\to .endif .endm With that definition, `SUM 0,5' is equivalent to this assembly input: .long 0 .long 1 .long 2 .long 3 .long 4 .long 5 `.macro MACNAME' `.macro MACNAME MACARGS ...' Begin the definition of a macro called MACNAME. If your macro definition requires arguments, specify their names after the macro name, separated by commas or spaces. You can supply a default value for any macro argument by following the name with `=DEFLT'. For example, these are all valid `.macro' statements: `.macro comm' Begin the definition of a macro called `comm', which takes no arguments. `.macro plus1 p, p1' `.macro plus1 p p1' Either statement begins the definition of a macro called `plus1', which takes two arguments; within the macro definition, write `\p' or `\p1' to evaluate the arguments. `.macro reserve_str p1=0 p2' Begin the definition of a macro called `reserve_str', with two arguments. The first argument has a default value, but not the second. After the definition is complete, you can call the macro either as `reserve_str A,B' (with `\p1' evaluating to A and `\p2' evaluating to B), or as `reserve_str ,B' (with `\p1' evaluating as the default, in this case `0', and `\p2' evaluating to B). When you call a macro, you can specify the argument values either by position, or by keyword. For example, `sum 9,17' is equivalent to `sum to=17, from=9'. `.endm' Mark the end of a macro definition. `.exitm' Exit early from the current macro definition. `\@' `as' maintains a counter of how many macros it has executed in this pseudo-variable; you can copy that number to your output with `\@', but *only within a macro definition*.